6-通信代码

通信代码

本代码经过修改可实现一对一实时通信,先启动服务器,再启动客户端

记得使用时更改ipv4地址和端口号

//Clint
#include<WinSock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
WORD wVersionRequested;
WSADATA wsadata;
int err;
wVersionRequested = MAKEWORD(2, 2);

err = WSAStartup(wVersionRequested, &wsadata);
if (err)
{
printf("WSAStartup errnum: %d\n", GetLastError());
return err;
}

if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
{
printf("LOBYTE errnum: %d\n", GetLastError());
WSACleanup();
return -1;
}

SOCKET sockCli;
sockCli = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("10.7.152.211");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(9999);


if (SOCKET_ERROR == connect(sockCli, (sockaddr*)&addrSrv, sizeof(sockaddr)))
{
printf("%d", GetLastError());
return -1;
}

char recvBuf[100] = { 0 }; //创建接收消息区
char sendBuf[100] = "hello";
while (1)
{
memset(recvBuf, 0, 100);
int iLen = recv(sockCli, recvBuf, 100, 0); //阻塞等待消息
if (iLen == SOCKET_ERROR)
{
printf("%d", GetLastError());
return -1;
}
printf("recvBuf : %s\n", recvBuf);
memset(sendBuf, 0, 100);
printf("send: ");
scanf("%s", sendBuf);
iLen = send(sockCli, sendBuf, 100, 0);
if (iLen == SOCKET_ERROR)
{
printf("%d", GetLastError());
return -1;
}
}


closesocket(sockCli);
return 0;
}


//Server
#include<WinSock2.h>
#include<stdio.h>
#include<stdlib.h>

#pragma comment(lib,"ws2_32.lib")
int main()
{
WORD wVersionRequested;
WSADATA wsadata;
int err;
wVersionRequested = MAKEWORD(2, 2);

err = WSAStartup(wVersionRequested, &wsadata);
if (err)
{
printf("WSAStartup errnum: %d\n", GetLastError());
return err;
}

if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
{
printf("LOBYTE errnum: %d\n", GetLastError());
WSACleanup();
return -1;
}

SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sockSrv)
{
printf("%d", GetLastError());
return -1;
}

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(9999);

if (SOCKET_ERROR == bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)))
{
printf("%d", GetLastError());
return -1;
}


if (SOCKET_ERROR == listen(sockSrv, 1))
{
printf("%d", GetLastError());
return -1;
}

SOCKADDR_IN addrCli;
int len = sizeof(SOCKADDR);

char sendBuf[100] = { 0 };
char recvBuf[100] = { 0 };
while (1)
{
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrCli, &len);
if (sockConn == SOCKET_ERROR)
{
printf("%d", GetLastError());
return -1;
}

//创建socket,从sockSrv中获取连接上的socket信息,并将对应的IP和端口置入addrCli
sprintf_s(sendBuf, 100, "Welcome %s to China!\n", inet_ntoa(addrCli.sin_addr));
printf("%s\n", sendBuf);
while (1)
{
int iLen = send(sockConn, sendBuf, strlen(sendBuf), 0);
if (iLen == SOCKET_ERROR)
{
printf("%d", GetLastError());
return -1;
}
memset(sendBuf, 0, 100);
memset(recvBuf, 0, 100);
iLen = recv(sockConn, recvBuf, 100, 0);
if (iLen == SOCKET_ERROR)
{
printf("%d", GetLastError());
return -1;
}
printf("RecvBuf : %s\nsend: ", recvBuf);
scanf("%s", sendBuf);
}

closesocket(sockConn);
}

closesocket(sockSrv);
}