【WinSocket】WinSocket 之TCP示例

来源:互联网 发布:淘宝客源码下载 编辑:程序博客网 时间:2024/04/29 00:44

一,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 1024int 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 processif((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 1printf("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 occurprintf("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 1024int 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 processif((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 serverprintf("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;}