socket编程中客户端常用函数 以及简单实现

1 常用函数

1.1   connect()

int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen);

  客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。connect()成功返回0,出错返回-1。

1.2   bind():很少用

  由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端口号由内核自动分配。注意,客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号,服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。

2 客户端的简单实现(C语言)

功能:连接到服务器后,如果服务器发送数据,则返回服务器发送的数据

unsigned char TcpRecvBuf[1520]  /* 缓存区,完整的以太帧最大也就1520或1518字节,如果去掉协议部分则可以更小 */
static  void Task_TCP_Client (void *pdata)
{
    struct sockaddr_in  server, client;
    int                 sock,   iState;
    int                 statusOk = 0;

    struct ip_addr stIpAddr;
    IP4_ADDR(&stIpAddr, REMOTE_IP_0, REMOTE_IP_1, REMOTE_IP_2, REMOTE_IP_3);
    server.sin_family       = AF_INET;                        /* 服务器地址类型为IPV4 */
    server.sin_port         = htons(80);                      /* 服务器的端口号为5000 */
    server.sin_addr.s_addr   = stIpAddr.addr;                 /* 服务器的IP地址      */
   /*
     * 以下4行为设置客户端的属性,可以不要,有系统自动分配端口号。即不调用bind函数。
     */
    client.sin_family       = AF_INET;
    client.sin_port         = htons( 4000 );                  /* 设置客户端的端口      */
    client.sin_addr.s_addr  = htonl( INADDR_ANY );
    bind( sock, (struct sockaddr *)&client, sizeof( client ) );/* 绑定本地接口         */
    sock = socket( AF_INET, SOCK_STREAM, 0 );                /* 使用TCP连接           */
    /*
     * 试图与服务器建立连接,不会阻塞程序
     */
    iState = connect(sock, (struct sockaddr *)&server, sizeof(struct sockaddr));
    while(1) {
        statusOk = read(sock, TcpRecvBuf, sizeof(TcpRecvBuf));
        if (statusOk > 0) {
            statusOk = write(sock, TcpRecvBuf,statusOk);
        }
        if (statusOk <= 0){
            iState = -1;
            while (iState == -1) {
                close( sock );                                /* 关闭此连接             */
               /*
                * 下面将重新与服务器建立连接
                */
                sock = socket( AF_INET, SOCK_STREAM, 0 );        /* 使用TCP连接         */
                bind( sock, (struct sockaddr *)&client, sizeof( client ) );/* 绑定本地接口  */
                iState = connect(sock, (struct sockaddr *)&server, sizeof( server ));
                OSTimeDly(100); // 延迟一会儿,(ucos-ii的延迟函数,可以用其它延迟函数替代)
            }
        }
    }
}
时间: 2024-10-10 22:54:41

socket编程中客户端常用函数 以及简单实现的相关文章

socket编程中服务器端常用函数 以及简单实现

1 常用函数 1.1   socket() int socket(int family, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1.对于IPv4,family参数指定为AF_INET.对于TCP协议,type参数指定为SOCK_STREAM,表示面向流的传输协议.如果是UDP协议,则type参数指定为SOCK_D

socket编程中最常用的几个数据类型和转换函数

高位字节优先和低位字节优先.Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换. 第一个结构类型是:struct sockaddr 该类型是用来保存socket信息的 struct sockaddr {   unsigned short sa_family;   /* 地址族, AF_xxx */   char sa_data[14];  /* 14 字节的协议地址 */ }; sa_family一

socket编程之三:socket网络编程中的常用函数

这节本来打算先给出常用函数介绍,再给两个代码实例,写着写着发现越来越长,决定把代码放在下一节. 本节内容持续更新...... 1 socket()函数 原型: int socket(int domain, int type, int protocol); 描述: 类似打开一个文件,返回一个socket描述符,唯一标识一个socket,后面相应的操作都是这用这个socket描述符. 参数: domain:协议族,常用的协议族有AF_INET.AF_INET6.AF_LOCAL.AF_ROUTE等:

python socket编程之客户端和服务端简单交互

服务端 #_*_ coding:utf-8 _*_ #导入socket模块 import socket # 创建socket对象 sk = socket.socket() #绑定侦听的IP和端口号 ip_port = ('192.168.9.213',9999) sk.bind(ip_port) #最大连接数 sk.listen(5) #接受请求,接受请求的时候可以获取到客户端的socket对象,以及客户端的IP和端口 #通过while循环,让服务端一直接受客户端请求 print "正在等待客户

socket编程中recv与send函数

recv函数会将套接字缓冲区中的内容读出,但不清空,与read函数的区别在此.此函数有一个flag标志位,设为MSG_PEEK. send函数会将缓冲区中的内容写入到套接字,也不清空,与write函数的区别在此. 用这两个函数可以先接收或发送缓冲区中的内容,然后再用readn(此时缓冲区中的内容依然存在)与write函数去继续判断换行符/n,对缓冲区内容实现换行输出. echocli.c #include <unistd.h> #include <sys/types.h> #inc

【windows socket编程+服务器客户端】

Windows Socket编程与服务器客户端示例 Winsock是 Windows下套接字标准. Socket套接字基于计算机网络,提供同一系统上不同进程或由局域网连接在一起的不同机器上的进程间通讯功能.如下图: 套接字通过IP地址,Port端口号标识,通过这个标识可以在整个局域网定位一个套接字,通过套接字进程便可以相互传输数据.如:进程A与进程B之间欲通过套接字通信,首先进程A创建一个有IP地址,端口号唯一标识的套接字,进程B同样创建一个有IP地址,端口号唯一标识的套接字,进程A,B便可以通

IP地址的三种表示格式及在Socket编程中的应用

转自:http://blog.csdn.net/hguisu/article/details/7449955 使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其实有三种不同的表示格式:  1)Ascii(网络点分字符串)-        2) 网络地址(32位无符号整形,网络字节序,大头)        3)主机地址 (主机字节序)   IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址,IP分组中的IP地址在网络

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <errno.h> int main() { pid_t pid, rpid; int stat; if ((pid = fork()) < 0) { perror("for

头文件algorithm中的常用函数

头文件algorithm中的常用函数 一.非修改性序列操作(12个) 循环         对序列中的每个元素执行某操作         for_each() 查找         在序列中找出某个值的第一次出现的位置         find() 在序列中找出符合某谓词的第一个元素     find_if() 在序列中找出一子序列的最后一次出现的位置         find_end() 在序列中找出第一次出现指定值集中之值的位置     find_first_of() 在序列中找出相邻的一对