首页 > 代码库 > Windows下C语言的Socket编程例子(TCP和UDP)

Windows下C语言的Socket编程例子(TCP和UDP)

一。  <TCP>

server端:

 1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4  5 #pragma comment(lib,"ws2_32.lib") 6  7 int main(int argc, char* argv[]) 8 { 9     //初始化WSA10     WORD sockVersion = MAKEWORD(2,2);11     WSADATA wsaData;12     if(WSAStartup(sockVersion, &wsaData)!=0)13     {14         return 0;15     }16 17     //创建套接字18     SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);19     if(slisten == INVALID_SOCKET)20     {21         printf("socket error !");22         return 0;23     }24 25     //绑定IP和端口26     sockaddr_in sin;27     sin.sin_family = AF_INET;28     sin.sin_port = htons(8888);29     sin.sin_addr.S_un.S_addr = INADDR_ANY; 30     if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)31     {32         printf("bind error !");33     }34 35     //开始监听36     if(listen(slisten, 5) == SOCKET_ERROR)37     {38         printf("listen error !");39         return 0;40     }41 42     //循环接收数据43     SOCKET sClient;44     sockaddr_in remoteAddr;45     int nAddrlen = sizeof(remoteAddr);46     char revData[255]; 47     while (true)48     {49         printf("等待连接...\n");50         sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);51         if(sClient == INVALID_SOCKET)52         {53             printf("accept error !");54             continue;55         }56         printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));57         58         //接收数据59         int ret = recv(sClient, revData, 255, 0);        60         if(ret > 0)61         {62             revData[ret] = 0x00;63             printf(revData);64         }65 66         //发送数据67         char * sendData = http://www.mamicode.com/"你好,TCP客户端!\n";68         send(sClient, sendData, strlen(sendData), 0);69         closesocket(sClient);70     }71     72     closesocket(slisten);73     WSACleanup();74     return 0;75 }

client端:

 1 #include "stdafx.h" 2 #include <WINSOCK2.H> 3 #include <STDIO.H> 4  5 #pragma  comment(lib,"ws2_32.lib") 6  7  8 int main(int argc, char* argv[]) 9 {10     WORD sockVersion = MAKEWORD(2,2);11     WSADATA data; 12     if(WSAStartup(sockVersion, &data) != 0)13     {14         return 0;15     }16 17     SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);18     if(sclient == INVALID_SOCKET)19     {20         printf("invalid socket !");21         return 0;22     }23 24     sockaddr_in serAddr;25     serAddr.sin_family = AF_INET;26     serAddr.sin_port = htons(8888);27     serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 28     if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)29     {30         printf("connect error !");31         closesocket(sclient);32         return 0;33     }34     char * sendData = http://www.mamicode.com/"你好,TCP服务端,我是客户端!\n";35     send(sclient, sendData, strlen(sendData), 0);36 37     char recData[255];38     int ret = recv(sclient, recData, 255, 0);39     if(ret > 0)40     {41         recData[ret] = 0x00;42         printf(recData);43     }44     closesocket(sclient);45     WSACleanup();46     return 0;47 }

 

二. <UDP>

SERVER 端

 1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4  5 #pragma comment(lib, "ws2_32.lib")  6  7 int main(int argc, char* argv[]) 8 { 9     WSADATA wsaData;10     WORD sockVersion = MAKEWORD(2,2);11     if(WSAStartup(sockVersion, &wsaData) != 0)12     {13         return 0;14     }15 16     SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 17     if(serSocket == INVALID_SOCKET)18     {19         printf("socket error !");20         return 0;21     }22 23     sockaddr_in serAddr;24     serAddr.sin_family = AF_INET;25     serAddr.sin_port = htons(8888);26     serAddr.sin_addr.S_un.S_addr = INADDR_ANY;27     if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)28     {29         printf("bind error !");30         closesocket(serSocket);31         return 0;32     }33     34     sockaddr_in remoteAddr;35     int nAddrLen = sizeof(remoteAddr); 36     while (true)37     {38         char recvData[255];  39         int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);40         if (ret > 0)41         {42             recvData[ret] = 0x00;43             printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));44             printf(recvData);            45         }46 47         char * sendData = http://www.mamicode.com/"一个来自服务端的UDP数据包\n";48         sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen);    49 50     }51     closesocket(serSocket); 52     WSACleanup();53     return 0;54 }

CLIENT 端

 1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4  5 #pragma comment(lib, "ws2_32.lib")  6  7 int main(int argc, char* argv[]) 8 { 9     WORD socketVersion = MAKEWORD(2,2);10     WSADATA wsaData; 11     if(WSAStartup(socketVersion, &wsaData) != 0)12     {13         return 0;14     }15     SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);16     17     sockaddr_in sin;18     sin.sin_family = AF_INET;19     sin.sin_port = htons(8888);20     sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");21     int len = sizeof(sin);22     23     char * sendData = http://www.mamicode.com/"来自客户端的数据包.\n";24     sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);25 26     char recvData[255];     27     int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);28     if(ret > 0)29     {30         recvData[ret] = 0x00;31         printf(recvData);32     }33 34     closesocket(sclient);35     WSACleanup();36     return 0;37 }

本文来至:http://blog.csdn.net/ssun125/article/details/8525823