学习TCP/IP客户端服务器的搭建

原文链接


用C写服务器端(Server.cpp)

#pragma comment(lib, "ws2_32.lib")//预编译  
#include <stdio.h>  
#include <winsock2.h>  
  
int main(int argc, char *argv[])  
{  
    //step1:初始化Windows Socket 2.2库  
    WSADATA              wsaData;  
    WSAStartup(MAKEWORD(2,2), &wsaData);  
  
    //step2:创建一个新的Socket来响应客户端的连接请求  
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
  
    //step3:填写服务器地址信息  
    int                  port = 5150;// 端口为5150  
    SOCKADDR_IN          serverAddr;  
    serverAddr.sin_family = AF_INET;  
    serverAddr.sin_port = htons(port);  
    //serverAddr.sin_addr.s_addr =inet_addr("10.66.103.187");  
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
    //IP地址为INADDR_ANY,使用htonl将IP地址转换为网络格式  
  
    //step4:绑定监听端口  
    bind(sListen, (SOCKADDR *)&serverAddr, sizeof(serverAddr));  
  
    //step5:开始监听,指定三次握手等待队列长度为5  
    listen(sListen, 5);  
  
    printf("开始监听......\n");  
  
    while(true)  
    {  
        //step6:接受新的连接  
        SOCKET  sNewConnection;  
        SOCKADDR_IN clientAddr;  
        memset(&clientAddr, 0, sizeof(clientAddr));  
        int clientAddrLen = sizeof(clientAddr);  
        sNewConnection = accept(sListen,  
            (SOCKADDR *)&clientAddr, &clientAddrLen);  
  
        //step7:新的连接建立后,就可以互相通信了,  
        //在这个简单的例子中,  
        //我们发送"Welcome to Network Programing!",然后关闭连接  
        //进行数据交换  
        while(1)  
        {  
            char message[1024];  
            int recvSize = recv(sNewConnection,  
                message, sizeof(message), 0);  
            if(recvSize <= 0)  
                break;  
            printf("%s: %s\n", "hu", message);  
  
            char data[1024] = {0};  
            printf("%s: ","li");  
            scanf("%s",data);  
            send(sNewConnection, data, strlen(message)+1, 0);  
        }  
        //关闭与客户通讯的套接字  
        closesocket(sNewConnection);  
        printf("%s","另一端关闭");  
    }  
  
    //step8:关闭套接字  
    closesocket(sListen);  
    //step9:释放Windows Socket DLL的相关资源  
    WSACleanup();  
    return 0;  
} 

然后是客户端(client.cpp)

  1. #include <stdio.h>  
  2. #include <winsock.h>  
  3.   
  4. #pragma comment(lib, "ws2_32.lib")//这句话的前面意思是静态加入一个lib文件也就是库文件ws2_32.lib文件,提供了对以下网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程(否则需要动态载入ws2_32.dll)。  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     //int First,Second;  
  9.     //step 1: 初始化Windows Socket 2.2库  
  10.     WSADATA                     wsaData;//功能是:存放windows socket初始化信息  
  11.     WSAStartup(MAKEWORD(2,2), &wsaData);  
  12.   
  13.     //step 2: 创建客户端SOCKET套接字  
  14.     SOCKET sClient = socket(AF_INET, SOCK_STREAM, 0);  
  15.   
  16.     //step 3: 设置服务器地址  
  17.     sockaddr_in serverAddr;  
  18.   
  19.     memset(&serverAddr, 0, sizeof(sockaddr_in));//去掉没有影响,暂时不知用途  
  20.     /*void *memset(void *s, int ch, size_t n); 
  21.     函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。 
  22.     memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法*/  
  23.   
  24.     serverAddr.sin_family = AF_INET;  
  25.     //serverAddr.sin_addr.s_addr = inet_addr(argv[1]);  
  26.     //serverAddr.sin_port = htons((u_short)atoi(argv[2]));  
  27.   
  28.     serverAddr.sin_addr.s_addr =inet_addr("127.0.0.1");  
  29.     //serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  30.     serverAddr.sin_port = htons(5150);  
  31.   
  32.     //step 4: 连接服务器  
  33.     connect(sClient, (SOCKADDR *)&serverAddr, sizeof(serverAddr));//sockaddr和sockaddr_in的区别:二者的占用的内存大小是一致的,因此可以互相转化,从这个意义上说,他们并无区别  
  34.   
  35.     //step 5:与服务器进行通讯  
  36.     while(1)  
  37.     {  
  38.         char data[1024] = {0};  
  39.         printf("%s: ","hu");  
  40.         scanf("%s",data);  
  41.         int sendSize = send(sClient, data, strlen(data)+1, 0);//第三个参数是缓冲区中数据的长度,返回所发送的数据的总长度或SOCKET_ERROR错误  
  42.         int recvSize = recv(sClient, data, 1024, 0);//第三个参数是缓冲区的长度;成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1  
  43.         printf("%s: %s\n""li", data);  
  44.   
  45.     }  
  46.   
  47.     //step 6:关闭套接字  
  48.     closesocket(sClient);  
  49.   
  50.     //step 7:释放Winsock库  
  51.     WSACleanup();  
  52.     getchar();  
  53.     getchar();  
  54.     return 0;  
  55. }  








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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值