windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo

设置方法

int nNetTimeout=10000;//10秒,
    //设置发送超时
    setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
    //设置接收超时
    setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

服务

 1 #include <stdio.h>
 2 #include <winsock2.h>
 3
 4 #pragma comment(lib,"ws2_32.lib")
 5
 6 int main(int argc, char* argv[])
 7 {
 8     //初始化WSA
 9     WORD sockVersion = MAKEWORD(2, 2);
10     WSADATA wsaData;
11     if (WSAStartup(sockVersion, &wsaData) != 0)
12     {
13         return 0;
14     }
15     //创建套接字
16     SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
17     if (slisten == INVALID_SOCKET)
18     {
19         printf("socket error !");
20         return 0;
21     }
22     //绑定IP和端口
23     sockaddr_in sin;
24     sin.sin_family = AF_INET;
25     sin.sin_port = htons(8888);
26     sin.sin_addr.S_un.S_addr = INADDR_ANY;
27     if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
28     {
29         printf("bind error !");
30     }
31     //开始监听
32     if (listen(slisten, 5) == SOCKET_ERROR)
33     {
34         printf("listen error !");
35         return 0;
36     }
37     //循环接收数据
38     SOCKET sClient;
39     sockaddr_in remoteAddr;
40     int nAddrlen = sizeof(remoteAddr);
41     char revData[1024];
42     while (true)
43     {
44         printf("等待连接...\n");
45         sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
46         if (sClient == INVALID_SOCKET)
47         {
48             printf("accept error !");
49             continue;
50         }
51         //接收数据
52         int ret = recv(sClient, revData, 255, 0);
53         if (ret > 0)
54         {
55             revData[ret] = 0x00;
56             printf(revData);
57         }
58         //发送数据
59         const char * sendData = "你好,TCP客户端!\n";
60         send(sClient, sendData, strlen(sendData), 0);
61     }
62     closesocket(sClient);
63     closesocket(slisten);
64     WSACleanup();
65     return 0;
66 }

客户端

#include <winsock2.h>
#include <WS2tcpip.h>
#include<stdio.h>
#include<iostream>
#include<cstring>

using namespace std;
#pragma comment(lib, "ws2_32.lib")

int main()
{
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA data;
    if (WSAStartup(sockVersion, &data) != 0)
    {
        return 0;
    }
    sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8888);
    inet_pton(AF_INET, "127.0.0.1", &serAddr.sin_addr);

    while (true)
    {
        SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sclient == INVALID_SOCKET)
        {
            printf("invalid socket!");
            return 0;
        }
        if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
        {  //连接失败
            printf("connect error !");
            closesocket(sclient);
            return 0;
        }
        send(sclient, "asd", strlen("asd"), 0);
        char recData[255];
        int ret = recv(sclient, recData, 255, 0);
        if (ret > 0) {
            recData[ret] = 0x00;
            printf(recData);
        }
        closesocket(sclient);
    }
    WSACleanup();
    return 0;
}

原文:https://blog.csdn.net/weixinhum/article/details/81742248

原文地址:https://www.cnblogs.com/wangshaowei/p/11732042.html

时间: 2024-10-27 16:45:46

windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo的相关文章

socket为send和recv设置超时时间

linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别 UDP的socket在某些情况:如对方关闭时,本地可能sendto不出去数据,然后recvfrom就会被阻塞,这时就需要设置 这两个参数的值提高程序质量. linux: struct timeval timeout={3,0};//3s    int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,(const char*)&timeo

深入理解TCP协议及其源代码——send和recv背后数据的收发过程

TCP数据发送和接收的原理 TCP连接的建立过程 TCP Socket的连接的过程是服务端先通过socket()函数创建一个socket对象,生成一个socket文件描述符,然后通过bind()函数将生成的socket绑定到要监听的地址和端口上面.绑定好了之后,使用listen()函数来监听相应的端口.而客户端是在通过socket()函数创建一个socket对象之后,通过connect()函数向被服务端监听的socket发起一个连接请求,即发起一次TCP连接的三次握手.接下来就可以就可以通过TC

使用Code::blocks在windows下写网络程序

使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Public License,v3 发布 GPLv3 许可证的副本可以在这里获得:http://www.gnu.org/licenses/gpl.html 本文档根据GNU Free Documentation License 1.3发布 GFDL1.3许可证的副本可以在这里获得:ht

Docker windows下安装,Build和Run的步骤及注意事项

一.关于Docker 什么是Docker?Docker 采用go语言编写,是一个开源的应用容器引擎.让开发者可以快速打包他们的应用以及依赖包到一个封装的可移植的容器Image中,然后发布到任何流行的机器( Linux ,windows,Mac等)上,也可以实现虚拟化.容器是使用完全独立的沙箱机制,相互之间不会有任何接口.可以同时运行多个Container,且相互独立各不干扰,对于多环境下的系统测试非常有用,但是Docker的应用远不止此. 二.安装 1. Windows 7系统下建议使用Dock

在windows下安装hadoop

本博文完全引用于http://blog.csdn.net/nazarite_wen/article/details/34409923.防止引用博文被删除,重新copy一遍. Windows下运行Hadoop,通常有两种方式:一种是用VM方式安装一个Linux操作系统,这样基本可以实现全Linux环境的Hadoop运行:另一种是通过Cygwin模拟Linux环境.后者的好处是使用比较方便,安装过程也简单.在这里咱们就来看看第二种方案:如何再Windows下快速安装一个Hadoop环境,并结合Ecl

Python监控Windows下的文件变化

windows下监控文件系统的变化,用python很方便.实例代码如下,很简单,也不多说了. import os import win32file import win32con ACTIONS = { 1 : "Created", 2 : "Deleted", 3 : "Updated", 4 : "Renamed from something", 5 : "Renamed to something" }

Windows下从源代码编译Skia

在PPAPI里面画图,能够结合第三方的图形库.比方Cairo.Skia. Google Chrome.Chromium和Android都使用Skia作为画图引擎.我也来试试Skia,先过编译关. foruok原创.如需转载请关注foruok的微信订阅号"程序视界"联系foruok. CEF编译出的Skia不可单独用 Chromium使用Skia.Windows下从源代码编译CEF说明了怎么编译CEF,它会捎带着编译Chromium.里面有Skia,但它编译出来的skia_library

Windows下运行Hadoop

Windows下运行Hadoop,通常有两种方式:一种是用VM方式安装一个Linux操作系统,这样基本可以实现全Linux环境的Hadoop运行:另一种是通过Cygwin模拟Linux环境.后者的好处是使用比较方便,安装过程也简单.在这里咱们就来看看第二种方案:如何再Windows下快速安装一个Hadoop环境,并结合Eclipse开发环境研究和调整Hadoop代码. 整个安装过程包括以下三大步骤: 安装和配置Cygwin(http://cygwin.com/install.html) 安装和配

Windows下使用GetGlyphOutline在OpenGL中渲染字体

欢迎转载,请标明出处:http://blog.csdn.net/tianyu2202/ 无图无JB,先上图.使用OpenGL绘制字体,支持多种字体,支持TrueType轮廓字体,支持自选字体纹理大小和输出大小,支持在三维空间内绘制. 关于OpenGL中字体的显示网上其实有很多的教程,不过经常用到的方式有比较简单的Bitmap方式.比较复杂的FreeType方式.而本文介绍的方式虽然只能在Windows下实现,却有着和FreeType一样的显示效果,最重要的是非常简单,仅仅200多行代码即可实现.