前兩次的socket網絡編程程序都是基於TCP 的,而這次使用UDP非面向連接的協議來寫的,只管發送就可以了,在發送數據量小的情況下非常有效率,發送的這些數據不能是重要的數據,因爲可能發生數據丟失、損毀等情況。Talk is cheap , show me the code.
server.c
#include<stdlib.h>
#include<stdio.h>
#include<WinSock2.h>
#define RECV_BUF_SIZE 1024
#pragma comment(lib,"ws2_32.lib")
int main(){
WSADATA wsd;
SOCKET sServer;
SOCKADDR_IN addrServer, addrClient;
int recvCount = 100;
int sizeAddrClient = 0;
char recvBuf[RECV_BUF_SIZE];
memset(recvBuf, 0, RECV_BUF_SIZE);
//初始化socket庫
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0){
ErrorHandling("WSAStartup error!");
}
puts("初始化socket庫");
//創建服務端socket
sServer = socket(AF_INET, <strong><span style="color:#ff0000;">SOCK_DGRAM</span></strong>, 0);
if (sServer == INVALID_SOCKET){
ErrorHandling("socket() error!");
}
puts("創建服務端socket");
//初始化網絡地址信息
memset(&addrServer, 0, sizeof(addrServer));
addrServer.sin_family = AF_INET;
addrServer.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
addrServer.sin_port = htons(6000);
puts("初始化網絡地址信息");
//綁定地址信息到服務端socket
if (bind(sServer, (SOCKADDR*)&addrServer, sizeof(addrServer)) == SOCKET_ERROR){
ErrorHandling("bind() error!");
}
printf("%d",WSAGetLastError());
puts("綁定地址信息到服務端socket");
sizeAddrClient = sizeof(SOCKADDR);
//循環接收消息(我規定最多爲200次)
while (recvCount>0){
int recvNum = recvfrom(sServer, recvBuf, RECV_BUF_SIZE,0, (SOCKADDR*)&addrClient, &sizeAddrClient);
printf("%d",recvNum);
sendto(sServer, recvBuf, RECV_BUF_SIZE, 0, (SOCKADDR*)&addrClient, sizeAddrClient);
printf("Echo:%s\n", recvBuf);
memset(recvBuf, 0, 1024);
recvCount--;
}
//關閉socket
closesocket(sServer);
WSACleanup();
puts("關閉socket");
system("pause");
return 0;
}
client.c
</pre><pre class="cpp" name="code" snippet_file_name="blog_20160404_5_4651503" code_snippet_id="1634444">#include<stdlib.h>
#include<stdio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
void ErrorHandling(char * msg){
puts(msg);
system("pause");
exit(1);
}
int main(){
WSADATA wsd;
SOCKET sClient;
SOCKADDR_IN addrServer;
int sizeaddrServer = 0;
int recvCount = 100;
char charBuf[1024] = { 0 };
//初始化socket庫
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0){
ErrorHandling("WSAStartup error!");
}
puts("初始化socket庫");
//創建客戶端socket
sClient = socket(AF_INET, SOCK_DGRAM, 0);
if (sClient == INVALID_SOCKET){
ErrorHandling("socket() error!");
}
puts("創建客戶端socket");
//初始化網絡地址信息
memset(&addrServer, 0, sizeof(addrServer));
addrServer.sin_family = AF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrServer.sin_port = htons(6000);
puts("初始化網絡地址信息");
//連接服務端
if (connect(sClient, (SOCKADDR*)&addrServer, sizeof(addrServer)) == SOCKET_ERROR){
ErrorHandling("connect error!");
}
puts("現在可以向服務端發送消息");
//循環發送消息(我規定最多爲200次)
int recvNum = 0;
char charRecv[1024];
char recvBuf[1024];
memset(recvBuf, 0, 1024);
memset(charRecv, 0, 1024);
int addrSize=sizeof(SOCKADDR);
while (recvCount>0){
memset(charBuf, 0, 1024);
memset(recvBuf, 0, 1024);
printf("To:");
gets(charBuf);
int sendLen = sendto(sClient, charBuf, 1024,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
int recvLen = recvfrom(sClient, recvBuf, 1024, 0, (SOCKADDR*)&addrServer, &addrSize);
if (recvLen==-1){
printf("服務器未響應\n");
}
else{
printf("來自服務器的消息:%s\n",recvBuf);
}
recvCount--;
}
//關閉socket
closesocket(sClient);
WSACleanup();
puts("關閉socket");
system("pause");
return 0;
}
不明白的地方,請回復。