本文将套接字的初始化,套接字的关闭,以及创建套接字单独封装为函数,精简了main函数。以下为函数代码详解。
server服务器端
1.初始化网络库
bool init_Socket()//初始化网络库
{
WSADATA wsadata;
if(0!=WSAStartup(MAKEWORD(2,2),&wsadata ))//windows异步套接字启动
{
printf("[error]WSAStarup failed,code %d\n", WSAGetLastError());
return false;
}
return true;
}
2.关闭网络库
bool close_Socket()//关闭网络库
{
if (0!=WSACleanup())
{
printf("[error]WSACleanup failed,code %d", WSAGetLastError());
return false;
}
return true;
}
3.创建套接字
SOCKET create_serverSocket()
{
SOCKET fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建一个空的socket
if (INVALID_SOCKET == fd)
{
printf("[error]socket failed,code %d", WSAGetLastError());
return INVALID_SOCKET;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);//把本地字节序转换为网络字节序
addr.sin_addr.S_un.S_addr = ADDR_ANY;//绑定本地任意IP
if (SOCKET_ERROR == bind(fd,(struct sockaddr *)&addr, sizeof(addr)))
{
printf("[error]bind failed,code %d", WSAGetLastError());
return INVALID_SOCKET;//-1
}
listen(fd, 10);
return fd;
}
4.main函数
int main()
{
char recvBu[1024] = "今天周几?";
init_Socket();
SOCKET serfd = create_serverSocket();
printf("server create successed,wait client connet....\n ");//
SOCKET clifd = accept(serfd, NULL, NULL);
if (clifd==INVALID_SOCKET)
{
printf("[error]accept failed,code %d", WSAGetLastError());
}
//printf("您好,请问有什么问题\n");
if (SOCKET_ERROR== send(clifd, recvBu, strlen(recvBu), 0))
{
printf("[error]hgello send failed,code %d", WSAGetLastError());
}
char recvBuf[1024] = "";
int ret = recv(clifd, recvBuf, 1024, 0);
if (ret == 0)
{
printf("客户端正常下线下线\n");
}
else if (ret < 0)
{
err("recv");
}
puts(recvBuf);
closesocket(clifd);
closesocket(serfd);
close_Socket();
getchar();
return 0;
}
至此,server代码主要模块撰写完毕,头文件与完整代码将在文末给出。
cilent客户端
1.初始化网络库
bool init_Socket()//初始化网络库
{
WSADATA wsadata;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))//windows异步套接字启动
{
printf("[error]WSAStarup failed,code %d\n", WSAGetLastError());
return false;
}
return true;
}
2.创建套接字
此函数调用的时候需要自己输入本机ip地址。
SOCKET create_clientSocket(const char* ip)
{
SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建一个空的socket
if (INVALID_SOCKET == fd)
{
err("socket");
return INVALID_SOCKET;
}
//给socket绑定服务端的ip地址和端口号
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);//把本地字节序转换为网络字节序
addr.sin_addr.S_un.S_addr = inet_addr(ip);//绑定服务器任意IP
if (INVALID_SOCKET == connect(fd, (struct sockaddr*)&addr, sizeof(addr)))
{
err("connec");
return INVALID_SOCKET;
}
return fd;
}
3.main函数
int main()
{
init_Socket();
SOCKET fd = create_clientSocket("127.0.0.1");
char recvBuf[1024] = "";
int ret = recv(fd, recvBuf, 1024, 0);
if (ret == 0)
{
printf("下线\n");
}
else if(ret<0)
{
err("recv");
}
puts(recvBuf);
char sendBuf[1024] = "今天周五";
send(fd, sendBuf, strlen(sendBuf), 0);
closesocket(fd);
getchar();
return 0;
}
至此,cilent客户端主要模块撰写完毕,让我们来看看运行结果。
完整代码如下:
Windows下的socket通信,采用tcp协议,简单的报文交互,c语言。-C文档类资源-CSDN下载
版权声明:本文为qq_44711805原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。