http://blog.csdn.net/tianshuai11/article/details/8197713
一,TCP通信过程
服务端:
socket( ) //定义socket
bind( ) //绑定本地地址和端口号
listen( ) //监听客户端请求
accept( ) //接收客户端请求
recv( ) //接收客户端数据
closesocket( )
客户端:
socket( )
connect( ) //请求连接服务器
send( ) //发送消息
closesocket( )
1)服务端:
- #include <stdio.h>
- #include <winsock2.h>
- #pragma comment(lib,"ws2_32.lib")
- #define BUFLEN 1024
- int main()
- {
- SOCKET serversoc;
- SOCKET clientsoc;
- SOCKADDR_IN serveraddr;
- SOCKADDR_IN clientaddr;
- char buf[BUFLEN];
- int len;
- WSADATA wsa;
- WSAStartup(MAKEWORD(1,1),&wsa); //initial Ws2_32.dll by a process
- if((serversoc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0) //create a tcp socket
- {
- printf("Create socket fail!\n");
- return -1;
- }
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_port = htons(9102);
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- if(bind(serversoc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0)
- {
- printf("Bind fail!\n");
- return -1;
- }
- //start listen, maximum length of the queue of pending connections is 1
- printf("Start listen...\n");
- if(listen(serversoc, 1) != 0) //监听客户端的请求
- {
- printf("Listen fail!\n");
- return -1;
- }
- len = sizeof(SOCKADDR_IN);
- if((clientsoc = accept(serversoc, (SOCKADDR *)&clientaddr, &len))<=0)//接收客户端的请求
- {
- printf("Accept fail!\n");
- return -1;
- }
- printf("Connected\n");
- while(1)//打印客户端发送的消息
- {
- if(recv(clientsoc, buf, BUFLEN, 0) <= 0)
- {
- //some error occur
- printf("Close connection\n");
- closesocket(clientsoc);
- break;
- }
- else
- {
- printf("%s\n",buf);
- }
- }
- WSACleanup(); //clean up Ws2_32.dll
- return 0;
- }
2)客户端
- #include <stdio.h>
- #include <winsock2.h>
- #pragma comment(lib,"ws2_32.lib")
- #define BUFLEN 1024
- int main()
- {
- SOCKET soc;
- SOCKADDR_IN serveraddr; //TCP使用的都是socket_in数据结构
- SOCKADDR_IN clientaddr;
- char buf[BUFLEN];
- WSADATA wsa;
- WSAStartup(MAKEWORD(1,1),&wsa); //initial Ws2_32.dll by a process
- if((soc = socket(AF_INET, //TCP/IP协议
- SOCK_STREAM, //TCP流传输
- IPPROTO_TCP)) <= 0) //create a tcp socket
- {
- printf("Create socket fail!\n");
- return -1;
- }
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_port = htons(9102); //服务端服务的端口号
- serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//服务器的IP地址
- //connect to server
- printf("Try to connect...\n");
- if(connect(soc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0)//请求连接服务器
- {
- printf("Connect fail!\n");
- return -1;
- }
- printf("Connected\n");
- while(1)//不断的向服务器发送消息
- {
- scanf("%s", buf);
- if(send(soc, buf, strlen(buf)+1, 0)<=0)
- {
- printf("Error!\n");
- }
- }
- WSACleanup(); //clean up Ws2_32.dll
- return 0;
- }