结论是实验得来,没有很严谨的查阅资料,注意recv()函数后面的注释就好
这是简单的服务器端代码
#include <WinSock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")
void main()
{
//用WSAStartup初始化套接字,分配网络资源。即网络层以下部分资源
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(1, 1);//WORD是16位无符号整形,详见WINDOWS常见数据类型,此处用于指定初始化的版本号
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;//初始化不成成功
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)//若初始化的版本号不对
{
WSACleanup();
return;
}
//创建套接字,套接字需要手动关闭
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//此处第一、第三个参数是固定的,第二个参数是TCP的写法,UDP是SOCK_DGRAM
if (INVALID_SOCKET == sockSrv)//这种写法比较容易发现==写错的情况
{
WSACleanup();
return;
}
//绑定到6000端口
SOCKADDR_IN addrSrv;//此处是TCP/IP必须使用的数据类型
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//此处指定服务器监听的网卡,此参数下监听所有网卡的所有地址,htonl用于把一个数变成一个网址
addrSrv.sin_port = htons(6000);//绑定端口6000
addrSrv.sin_family = AF_INET;//TCP/IP
err = bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (0 != err)
{
WSACleanup();
return;
}
//监听客户请求
listen(sockSrv, SOMAXCONN);//最大监听的个数
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (1)
{
//接收客户端请求,得到客户端信息,是一个阻塞函数
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
//向客户端发数据
char sendBuf[100];
sprintf(sendBuf, "im 网管,你是%s", inet_ntoa(addrClient.sin_addr));
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);//第二个参数是要发送的数据,第三个参数是此套接字缓冲区的大小
//接收数据
char recvBuf[100];
int nRecv = recv(sockConn, recvBuf, 100, 0);//返回值代表接收到的字符长度,接收到的字符长度应是对方套接字的缓冲区那么大,也就是说,send一次就会send client的套接字里缓冲区的所有内容,
printf("%s\n", recvBuf);
//关闭客户端连接
closesocket(sockConn);
}
//关闭服务器连接
closesocket(sockSrv);
WSACleanup();
}
下面是简单的客户端代码
#include <WinSock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")
void main()
{
WSADATA wsaData;
int err = WSAStartup(0x0101, &wsaData);
if (err != 0)
return;
SOCKET sockConn = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_port = htons(6000);
addrSrv.sin_family = AF_INET;
connect(sockConn, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
char recvBuf[100];
int nRecv = recv(sockConn, recvBuf, 100, 0);
recvBuf[nRecv] = '\0';
printf("%s\n", recvBuf);
send(sockConn, "hello there", 100,0);
closesocket(sockConn);
WSACleanup();
}