最近对socket(网络)编程很感兴趣,于是就了几本相关的书籍开始看,在网上查各种资料,对socket有了一点儿了解,写了一个服务端与客户端单向通信的实例。实践是检验真理的唯一标准,这句话就是真理,在写这个简单程序的时候,遇到了一些问题, 也都各个击破,之后还会写一些实例与大家分享。Talk is cheap , show me the code.
服务端:server.c
#include<stdlib.h>
#include<stdio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int main(){
WSADATA wsd;
SOCKET sServer, sClient;
SOCKADDR_IN addrServer, addrClient;
int recvCount = 100;
int sizeAddrClient = 0;
char charBuf[1024];
int recvNum = 0;
memset(charBuf, 0, 1024);
//初始化socket库
if (WSAStartup(MAKEWORD(2, 2), &wsd)!=0){
ErrorHandling("WSAStartup error!");
}
puts("初始化socket库");
//创建服务端socket
sServer = socket(AF_INET,SOCK_STREAM,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!");
}
puts("绑定地址信息到服务端socket");
//服务端进行监听
if (listen(sServer,5)==SOCKET_ERROR){
ErrorHandling("listen() error!");
}
puts("服务端进行监听ing");
sizeAddrClient = sizeof(addrClient);
//服务端进入接收消息状态(阻塞模式)
sClient = accept(sServer, (SOCKADDR*)&addrClient, &sizeAddrClient);
if (sClient==INVALID_SOCKET){
ErrorHandling("accept() error!");
}
printf("有用户连接:%s\n",inet_ntoa(addrClient.sin_addr));
//循环接收消息(我规定最多为200次)
while (recvCount>0){
int recvNum = recv(sClient, charBuf, 1024, 0);
if (recvNum == -1){
printf("exit\n");
break;
}
printf("Form:%s\n",charBuf);
memset(charBuf, 0, 1024);
recvCount--;
}
//关闭socket
closesocket(sClient);
closesocket(sServer);
WSACleanup();
puts("关闭socket");
system("pause");
return 0;
}
客户端:client.c
#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 addrClient;
int sizeAddrClient = 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_STREAM, 0);
if (sClient==INVALID_SOCKET){
ErrorHandling("socket() error!");
}
puts("创建客户端socket");
//初始化网络地址信息
memset(&addrClient, 0, sizeof(addrClient));
addrClient.sin_family = AF_INET;
addrClient.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrClient.sin_port = htons(6000);
puts("初始化网络地址信息");
//连接服务端
if (connect(sClient,(SOCKADDR*)&addrClient,sizeof(addrClient))==SOCKET_ERROR){
ErrorHandling("connect error!");
}
puts("现在可以向服务端发送消息");
//循环发送消息(我规定最多为200次)
while (recvCount>0){
memset(charBuf, 0, 1024);
printf("To:");
gets(charBuf);
send(sClient, charBuf, strlen(charBuf), 0);
memset(charBuf, 0, 1024);
recvCount--;
}
//关闭socket
closesocket(sClient);
WSACleanup();
puts("关闭socket");
system("pause");
return 0;
}
运行示示截图:
这是没开服务端,只开客户端:
这是服务端运行,还没有开启客户端时:
这是开启客户端之后:
通信效果:
好了,大家可以参考我的代码玩玩吧,不懂的可以回复额!
以后会继续增强功能!比如,双向通信,多线程通信。