流式套接字(SOCK_STREAM)——客户端/服务器(C/S)源代码

 

摘自: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;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值