本篇文章实现了一个基于TCP 的一个非常简单的客户/服务器通信程序实例。该程序中通讯协议使用的是面向连接的TCP协议SOCK_STREAM, 服务器的ip地址为本地地址即:
127.0.0.1,端口号为自定义的5099(大于1024即可),服务端的功能只要有客户端连接请求,服务端就接受连接,在连接成功后向客户端发送数据,并且接受客户端发送的
数据。客户端在向服务端发出请求后接受并显示服务端的数据,并且给服务端也发送数据。
以下代码是服务端程序代码:
-
#include <WinSock2.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
#pragma comment(lib, "ws2_32.lib")
-
-
void main()
-
{
-
WSADATA wsaData;
-
int port =
5099;
-
-
char buf[] =
"Server: hello, I am a server.....";
-
-
if(WSAStartup(MAKEWORD(
2,
2), &wsaData) !=
0)
-
{
-
printf(
"Failed to load Winsock");
-
return;
-
}
-
-
//创建用于监听的套接字
-
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM,
0);
-
-
SOCKADDR_IN addrSrv;
-
addrSrv.sin_family = AF_INET;
-
addrSrv.sin_port = htons(port);
//1024以上的端口号
-
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
-
-
int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv,
sizeof(SOCKADDR_IN));
-
if(retVal == SOCKET_ERROR){
-
printf(
"Failed bind:%d\n", WSAGetLastError());
-
return;
-
}
-
-
if(listen(sockSrv,
10) ==SOCKET_ERROR){
-
printf(
"Listen failed:%d", WSAGetLastError());
-
return;
-
}
-
-
SOCKADDR_IN addrClient;
-
int len =
sizeof(SOCKADDR);
-
-
while(
1)
-
{
-
//等待客户请求到来
-
SOCKET sockConn = accept(sockSrv, (SOCKADDR *) &addrClient, &len);
-
if(sockConn == SOCKET_ERROR){
-
printf(
"Accept failed:%d", WSAGetLastError());
-
break;
-
}
-
-
printf(
"Accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr));
-
-
//发送数据
-
int iSend = send(sockConn, buf,
sizeof(buf) ,
0);
-
if(iSend == SOCKET_ERROR){
-
printf(
"send failed");
-
break;
-
}
-
-
char recvBuf[
100];
-
memset(recvBuf,
0,
sizeof(recvBuf));
-
// //接收数据
-
recv(sockConn, recvBuf,
sizeof(recvBuf),
0);
-
printf(
"%s\n", recvBuf);
-
-
closesocket(sockConn);
-
}
-
-
closesocket(sockSrv);
-
WSACleanup();
-
system(
"pause");
-
}
接下来是客户端代码:
-
#include <WinSock2.h>
-
#include <stdio.h>
-
-
#pragma comment(lib, "ws2_32.lib")
-
-
void main()
-
{
-
//加载套接字
-
WSADATA wsaData;
-
char buff[
1024];
-
memset(buff,
0,
sizeof(buff));
-
-
if(WSAStartup(MAKEWORD(
2,
2), &wsaData) !=
0)
-
{
-
printf(
"Failed to load Winsock");
-
return;
-
}
-
-
SOCKADDR_IN addrSrv;
-
addrSrv.sin_family = AF_INET;
-
addrSrv.sin_port = htons(
5099);
-
addrSrv.sin_addr.S_un.S_addr = inet_addr(
"127.0.0.1");
-
-
//创建套接字
-
SOCKET sockClient = socket(AF_INET, SOCK_STREAM,
0);
-
if(SOCKET_ERROR == sockClient){
-
printf(
"Socket() error:%d", WSAGetLastError());
-
return;
-
}
-
-
//向服务器发出连接请求
-
if(connect(sockClient, (struct sockaddr*)&addrSrv,
sizeof(addrSrv)) == INVALID_SOCKET){
-
printf(
"Connect failed:%d", WSAGetLastError());
-
return;
-
}
else
-
{
-
//接收数据
-
recv(sockClient, buff,
sizeof(buff),
0);
-
printf(
"%s\n", buff);
-
}
-
-
//发送数据
-
char buff =
"hello, this is a Client....";
-
send(sockClient, buff,
sizeof(buff),
0);
-
-
//关闭套接字
-
closesocket(sockClient);
-
WSACleanup();
-
}
运行结果:
转载:https://blog.csdn.net/shenjie12345678/article/details/28321969
查看评论