这几天看了下有关TCP/IP协议的内容,了解了在windows下用winsock实现TCP/IP协议进行服务器与客户机进行基本的通信。
由于没有深入了解,只是熟悉了TCP/IP协议进行通信的基本过程,然后实现了一个用TCP协议进行通信的简单的服务器和客户机小程序,然后记录下来,方便以后自己翻看(争取有时间把《TCP-IP详解卷1:协议》看一遍)。
具体的代码如下,代码中过程基本上就是客户机与服务器用TCP协议通信的全过程,更加复杂的通信都是在这个基础上进行扩展的。
// 服务器端
//
#include "stdafx.h"
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
SOCKET s;
WSADATA wsdata;
//初始化动态链接库
if (WSAStartup(MAKEWORD(2,2),&wsdata) != 0)
{
printf_s("初始化动态链接库失败!");
return 0;
}
//创建socket
s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
printf_s("创建socket失败!");
WSACleanup();
return 0;
}
SOCKADDR_IN addr;
//socket地址与端口
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//绑定socket
int ret = bind(s,(LPSOCKADDR)&addr,sizeof(SOCKADDR_IN));
if (ret == SOCKET_ERROR)
{
printf("socket绑定错误!");
closesocket(s);
WSACleanup();
return 0;
}
//进入监听状态
ret = listen(s,1);
if (ret == SOCKET_ERROR)
{
printf_s("监听失败!");
closesocket(s);
WSACleanup();
return 0;
}
SOCKET s_new;
//接受客服端请求
s_new = accept(s,NULL,NULL);
if (s_new == INVALID_SOCKET)
{
printf_s("accept失败!");
closesocket(s);
WSACleanup();
return 0;
}
char buf[256];
ZeroMemory(buf,sizeof(buf));
//接受客服端传送的数据
ret = recv(s_new,buf,256,0);
if (ret == SOCKET_ERROR)
{
printf_s("接受数据失败!");
closesocket(s_new);
closesocket(s);
WSACleanup();
return 0;
}
//打印传送的数据
printf_s("%s\n",buf);
//释放资源
closesocket(s_new);
closesocket(s);
WSACleanup();
system("pause");
return 0;
}
// 客户端
//
#include "stdafx.h"
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
SOCKET s;
WSADATA wsdata;
//初始化动态链接库
if (WSAStartup(MAKEWORD(2,2),&wsdata) != 0)
{
printf_s("初始化动态链接库失败!");
return 0;
}
//创建socket
s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
printf_s("创建socket失败!");
WSACleanup();
return 0;
}
SOCKADDR_IN addr;
//设置服务器地址与端口
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(9000);
//连接服务器
int ret = connect(s,(LPSOCKADDR)&addr,sizeof(SOCKADDR_IN));
if (ret == SOCKET_ERROR)
{
printf_s("连接服务器失败!");
closesocket(s);
WSACleanup();
return 0;
}
char buf[256];
printf_s("输入数据:\n");
scanf_s("%s",buf,256);
//发送数据给服务器
ret = send(s,buf,sizeof(buf),0);
if (ret == SOCKET_ERROR)
{
printf_s("发送数据失败!");
closesocket(s);
WSACleanup();
return 0;
}
//释放资源
closesocket(s);
WSACleanup();
system("pause");
return 0;
}