socket的客户端和服务端的编程举例

时间:2021-08-19 22:16:48

socket 服务器端和客户端通信,面向TCP的

服务器端步骤:

1、创建用于监听的套接字(socket)

2、将套接字绑定到本地地址和端口上(bind)

3、将套接字设为监听模式(listen)

4、等待客户请求(accept),此处要不断的调用accept

5、通信(send/receive),完成后返回4

6、关闭套接字(closesocket)

 

客户端步骤:

1、创建套接字

2、向服务器发送连接请求(connect)

3、通信(send/recv)

4、关闭套接字

 

程序代码:http://www.cnblogs.com/xiao-cheng/archive/2012/02/04/2337822.html

服务器端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32.lib.")
  
void main()
{
  
     /* 加载套接字库 */
     WORD wVersionRequested;
     // 所使用套接字的版本号
     WSADATA wsaData;
     // 存储套接字版本的有关信息
     int err;
  
     wVersionRequested = MAKEWORD(1,1);
     // 请求版本号,高位和低位字节均为1
  
     err = WSAStartup(wVersionRequested,&wsaData);
     // 加载套接字
     if (err != 0)
     {
         return ;
     }
  
     if (LOBYTE(wsaData.wVersion)!=1 ||
         HIBYTE(wsaData.wVersion)!=1)
     {
         WSACleanup();
         //如果高位或低位字节不为1终止对套接字的使用
         return ;
     }
  
     /* 创建用于监听的套接字 */
     SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
     // 创建套接字,流式套接字,第三个参数设为0则自动选择合适的协议
  
     /* 绑定套接字 */
     SOCKADDR_IN addrSrv;
     // 服务器地址信息,使用SOCKADDR_IN 代替SOCKETADD, 结构体的大小相等,可强制转换
     addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
     addrSrv.sin_family=AF_INET;
     addrSrv.sin_port=htons(600);
     // 使用htons函数转换为网络字节序
      
     bind(sockSrv,(SOCKADDR *)&addrSrv, sizeof (SOCKADDR));
     // 将监听套接字绑定到本地地址和端口上
     listen(sockSrv,5);
     // 监听
  
     /* 等待客户到来并接收发送数据 */
     SOCKADDR_IN addrClient;
     // 接收客户地址信息缓冲区
     int len= sizeof (SOCKADDR);
  
     while (1){
         SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
         // 等待接收客户连接请求,并返回连接套接字,利用这个套接字实现通信
         char sendBuf[100];
         sprintf (sendBuf, "Welcome %s to www.cnblogs.com/xiao-cheng" ,
             inet_ntoa(addrClient.sin_addr));
         send(sockConn,sendBuf, strlen (sendBuf)+1,0);
         // 发送数据,多加一个长度是字符串结束符
         char recvBuf[100];
         recv(sockConn,recvBuf,100,0);
         // 接收数据
         printf ( "%s\n" ,recvBuf);
         closesocket(sockConn);
     }
}
?
1
客户端:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32.lib.")
  
void main()
{
     WORD wVersionRequested;
     WSADATA wsaData;
     int err;
  
     wVersionRequested=MAKEWORD(1,1);
  
     err=WSAStartup(wVersionRequested,&wsaData);
     if (err!=0)
     {
         return ;
     }
  
     if (LOBYTE(wsaData.wVersion)!=1
         || HIBYTE(wsaData.wVersion)!=1){
             WSACleanup();
             return ;
     }
     SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
  
     SOCKADDR_IN addrSrv;
     // 服务器地址信息
     addrSrv.sin_addr.S_un.S_addr=inet_addr( "127.0.0.1" );
     addrSrv.sin_family=AF_INET;
     addrSrv.sin_port=htons(600);
  
     connect(sockClient,(SOCKADDR*)&addrSrv, sizeof (SOCKADDR));
     // 向服务器发送连接请求
  
     char recvBuf[100];
     recv(sockClient,recvBuf,100,0);
     printf ( "%s\n" ,recvBuf);
  
     send(sockClient, "Request" , strlen ( "Request" )+1,0);
  
     closesocket(sockClient);
     WSACleanup();
}