摘自:http://wxxweb.blog.163.com/blog/static/135126900201022691449421/
实现最简单的客户端和服务器程序
先总结一下简单的流程再将这两部分的源代码贴出来。
服务器:
1. 绑定Socket库:调用WSAStartup函数(只用于Windows操作系统中)
2. 获取Socket描述符:调用socket函数
3. 将Socket描述符与指定地址进行绑定:调用bind函数
4. 监听连接:调用listen函数
5. 接受连接:调用accept函数
6. 发送和接收信息:分别调用send函数和recv函数
7. 释放Socket描述符所对应的资源:调用closesocket函数或shutdown函数
8. 解除Socket库绑定:调用WSACleanup函数(这个函数与WSAStartup函数对应,只用于Windows操作系统中)
客户端:
1. 绑定Socket库:调用WSAStartup函数(只用于Windows操作系统中)
2. 获取Socket描述符:调用socket函数
3. 将Socket描述符与指定地址进行绑定:调用bind函数
4. 连接到服务器:调用connect函数
5. 发送和接收信息:分别调用send函数和recv函数
6. 释放Socket描述符所对应的资源:调用closesocket函数或shutdown函数
7. 解除Socket库绑定:调用WSACleanup函数(这个函数与WSAStartup函数对应,只用于Windows操作系统中)
服务器程序源代码:
#pragma comment(lib, "ws2_32")
#include
#include
#include
int main()
{
int Listen_Sock = -1;
int Connect_Sock = -1;
int sin_size = 0;
int iBytesNum = 0;
BOOL IsOK;
WSADATA wsaData;
struct sockaddr_in Server_Addr = {0};
struct sockaddr_in Client_Addr = {0};
char szBuf[256] = {0};
char szHostName[256] = {0};
// 绑定Socket库
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 获取套接字文件描述符
Listen_Sock = socket(AF_INET, SOCK_STREAM, 0);
/* 获取套接字文件描述符出错 */
if (-1 == Listen_Sock)
{
printf("socket() failed:%d ", errno);
system("pause");
return -1;
}
/* 获取套接字文件描述符成功 */
else
{
printf("socket() succeed:%d ", Listen_Sock);
}
// 填写服务器地址信息
Server_Addr.sin_family = AF_INET;
Server_Addr.sin_addr.s_addr = htonl(INADDR_ANY);
Server_Addr.sin_port = htons(4567);
memset(&(Server_Addr.sin_zero), 0, sizeof(Server_Addr.sin_zero));
IsOK = bind(Listen_Sock, (struct sockaddr *)&Server_Addr,
sizeof(struct sockaddr));
/* 绑定套接字文件描述符到指定的地址出错 */
if (-1 == IsOK)
{
printf("bind() failed:%d", errno);
system("pause");
return -1;
}
/* 绑定套接字文件描述符到指定的地址成功 */
else
{
printf("bind() succeed:%d ", IsOK);
}
// 监听
listen(Listen_Sock, 2);
// 接受
sin_size = sizeof(struct sockaddr_in);
Connect_Sock = accept(Listen_Sock, (struct sockaddr *)&Client_Addr, &sin_size);
/* 接受失败 */
if (-1 == Connect_Sock)
{
printf("accept() failed:%d ", errno);
system("pause");
return -1;
}
/* 接受成功 */
else
{
printf("accept() succeed:%d ", Connect_Sock);
}
while (1)
{
// 接收TCP消息
iBytesNum = recv(Connect_Sock, szBuf, sizeof(szBuf) - 1, 0);
/* 接收失败 */
if (-1 == iBytesNum)
{
printf("recv() failed:%d ", errno);
system("pause");
return -1;
}
/* 接收成功 */
else
{
printf("接收数据:%s ", szBuf);
}
// 回发
iBytesNum = send(Connect_Sock, szBuf, strlen(szBuf), 0);
memset(szBuf, 0, sizeof(szBuf));
}
// 关闭套接字
closesocket(Listen_Sock);
closesocket(Connect_Sock);
// 解除Socket库绑定
WSACleanup();
system("pause");
return 0;
}
客户端程序源代码:
#pragma comment(lib, "ws2_32")
#include
#include
#include
int main()
{
int Connect_Sock = -1;
int sin_size = 0;
int iBytesNum = 0;
BOOL IsOK = FALSE;
WSADATA wsaData;
struct sockaddr_in Dest_Addr = {0};
char szMsg[256] = "Hello Network !";
char szHostName[256] = {0};
// 绑定Socket库
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 获取Socket文件描述符
Connect_Sock = socket(AF_INET, SOCK_STREAM, 0);
/* 获取Socket文件描述符出错 */
if (-1 == Connect_Sock)
{
printf("socket() failed:%d ", errno);
system("pause");
return -1;
}
/* 获取Socket文件描述符成功 */
else
{
printf("socket() succeed:%d ", Connect_Sock);
}
Dest_Addr.sin_family = AF_INET;
Dest_Addr.sin_addr.s_addr = inet_addr("192.168.1.133");
Dest_Addr.sin_port = htons(4567);
memset(&(Dest_Addr.sin_zero), 0,sizeof(Dest_Addr.sin_zero));
// 连接到服务器
IsOK = connect(Connect_Sock, (struct sockaddr *)&Dest_Addr,
sizeof(struct sockaddr_in));
/* 连接服务器出错 */
if (-1 == IsOK)
{
printf("connect() failed:%d ", errno);
system("pause");
return -1;
}
/* 连接服务器成功 */
else
{
printf("connect() succeed:%d ", IsOK);
}
while (1)
{
// 发送TCP消息
iBytesNum = send(Connect_Sock, szMsg, strlen(szMsg), 0);
/* 发送失败 */
if (-1 == iBytesNum)
{
printf("send() failed:%d ", errno);
system("pause");
return -1;
}
/* 发送成功 */
else
{
printf("发送了%d个字节数据! ", iBytesNum);
}
memset(szMsg, 0, sizeof(szMsg));
iBytesNum = recv(Connect_Sock, szMsg, sizeof(szMsg) - 1, 0);
/* 发送失败 */
if (-1 == iBytesNum)
{
printf("recv() failed:%d ", errno);
system("pause");
return -1;
}
/* 发送成功 */
else
{
printf("接收信息:%s ", szMsg);
}
fputs("发送信息:", stdout);
scanf("%s", szMsg);
}
// 关闭套接字
closesocket(Connect_Sock);
// 解除Socket库绑定
WSACleanup();
system("pause");
return 0;
}