window编程socket(C版本)

前言

为什么要弄出一个window C版本的程序?使用python的tcp不是更为容易?其实我做这个的目的就是为了测试自己写的C代码,通过tcp的socket编程可以理解为tcp == 串口,可以测试协议数据等等,此外可以移植如加密的各种算法,然后通过tcp通道传入加密原始数据,加密后返回加密结果等等,算是一个小工具。话不多说上代码 。

#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>
#define SERVER_PORT 6789 //侦听端口

int main()
{
	    WORD wVersionRequested;
	    WSADATA wsaData;
	    int ret, length;
	    int recv_len = 0;
	    SOCKET sListen, sServer; //侦听套接字,连接套接字
	    struct sockaddr_in saServer, saClient; //地址信息
	    char *ptr;//用于遍历信息的指针
	    //WinSock初始化
	    wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
	    ret=WSAStartup(wVersionRequested, &wsaData);
	    if(ret!=0)
	    {
	        printf("WSAStartup() failed!\n");
	        return -1;
	    }
	    //创建Socket,使用TCP协议
	    sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	    if (sListen == INVALID_SOCKET)
	    {
	        WSACleanup();
	        printf("socket() faild!\n");
	        return -1;
	    }
	    //构建本地地址信息
	    saServer.sin_family = AF_INET; //地址家族
	    saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序
	    saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址

	    //绑定
	    ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));
	    if (ret == SOCKET_ERROR)
	    {
	        printf("bind() faild! code:%d\n", WSAGetLastError());
	        closesocket(sListen); //关闭套接字
	        WSACleanup();
	        return -1;
	    }
	
	    //侦听连接请求
	    ret = listen(sListen, 5);
	    if (ret == SOCKET_ERROR)
	    {
	        printf("listen() faild! code:%d\n", WSAGetLastError());
	        closesocket(sListen); //关闭套接字
	        return -1;
	    }
	
	    printf("Waiting for client connecting!\n");
	    printf("Tips: Ctrl+c to quit!\n");
	    //阻塞等待接受客户端连接
	    while(1)//循环监听客户端
	    {
	        length = sizeof(saClient);
	        sServer = accept(sListen, (struct sockaddr *)&saClient, &length);
	        if (sServer == INVALID_SOCKET)
	        {
	            printf("accept() faild! code:%d\n", WSAGetLastError());
	            closesocket(sListen); //关闭套接字
	            WSACleanup();
	            return -1;
	        }
	        printf("accept is success!\n");
	        printf("receive connect ip is %s ",inet_ntoa(saClient.sin_addr));
	#if 0
	        char receiveMessage[1024];
	        ptr = (char *)&receiveMessage;
	#else
	        char *receiveMessage = (char *)calloc(2048, 0);
	        ptr = receiveMessage;
	#endif
	        while(1)
	        {
	            //接收数据
	            recv_len = recv(sServer, ptr, 1024, 0);
	            printf("===%d\n",recv_len);
	            receiveMessage[recv_len] = 0;
	            if (recv_len == SOCKET_ERROR)
	            {
	                printf("recv() failed!\n");
	                return -1;
	            }
	            if (recv_len == 0) //客户端已经关闭连接
	            {
	                printf("Client has closed the connection\n");
	                break;
	            }
	            char * sendData = "hello callback send data";
	            send(sServer, sendData, strlen(sendData), 0);
	            printf("recv is %s\n", ptr);
	            memset(receiveMessage,0, sizeof(receiveMessage));
	        }
	    }
	}

测试结果:
连接:
在这里插入图片描述
小工具发送 “hello world”
在这里插入图片描述
OK !!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值