多线程socket网络编程在线程中出现段错误,recv返回-1

图片说明

如图,通过右边的变量信息可知在第一个线程中socket没错,recv成功接收到消息,但把socket传递给下一个消息循环接收处理线程却报错:在一个非套接字上尝试了一个操作。继续执行,则会出现第二张图上的错误提示图片说明

即段错误,不知该怎么解决,望有大神能够解答下我。多谢
下面是两个线程函数代码

//服务器线程函数
DWORD WINAPI ServerThread(LPVOID lpParam)
{
  int AddrSize;
  char buff[1024] = {0};        //存放接受信息
  TH tp;                        //传递的参数
  struct sockaddr_in their_addr;
  EnterCriticalSection(&gs);
  AddrSize = sizeof(struct sockaddr_in);
  tp.hwnd = (HWND)lpParam;
  tp.socket = accept(sockfd ,(struct sockaddr*)&their_addr ,&AddrSize);
  if(tp.socket != INVALID_SOCKET)
  {
    recv(tp.socket,buff,20,0);
    MessageRecv(buff,tp.socket,tp.hwnd);
    cThread = (HANDLE)CreateThread(NULL,0,ClientThread ,&tp, 0, NULL);
    if (cThread == NULL)
    {
      GetLastError();
      ShowError();
    }
  }
  LeaveCriticalSection(&gs);
}

//通信线程函数
DWORD WINAPI ClientThread(LPVOID lpParam)
{
  char buff[1024] = {0};
  TH *tp = (TH *)lpParam;
  EnterCriticalSection(&gs);
  while(1)
  {
    if(recv(tp->socket,buff,1024,0) != SOCKET_ERROR)
    {
      MessageRecv(buff,tp->socket,tp->hwnd);
    }
    else
    {
      GetLastError();
      ShowError();
    }
  }
  LeaveCriticalSection(&gs);
}

3个回答

TH tp; //传递的参数 这个是局部变量,你把局部变量传递给线程,在主函数运行完之后,就把tp销毁了,所以在线程 函数中 就抱错了。

lhg1714538808
lhg1714538808 谢谢,问题解决,socket传进去了,我加了一句:SOCKET sock = tp->socket;查看sock确认socket已传入
8 个月之前 回复

多线程 socket数据请求要加锁,不然同时操作一块内存数据污染,还会crash

lhg1714538808
lhg1714538808 谢谢
8 个月之前 回复

使用信号量保护比较好一些

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
linux socket recv 段错误
本人在linux端做一个简单的socket客户端测试程序。rn[color=#FF0000]但是在运行过程中,执行到接收对方响应报文长度的代码处就报段错误rnread_count = recv(g_bf_socket, buffer, 4, 0);[/color]rnrn请高手帮忙分析分析是什么导致,我真的看不出代码哪里有问题啊?如果去掉这行代码就什么问题都没有。rnrnrn全部代码如下:rnrn[code=c]rn#include // for sockaddr_inrn#include // for socketrn#include // for socketrn#include // for printfrn#include // for exitrn#include // for bzero rn#includern#define BUFFER_SIZE 10240rnrn/************************************************************************/rn/* 客户端 */rn/************************************************************************/rn#define BIG_FRONT_END_IP ("192.168.10.146") //rn#define BIG_FRONT_END_PORT 9999 //rnint g_bf_socket; //rnstruct sockaddr_in g_bf_addr; //rnrnint bf_init(); //初始化与xxx通信相关的定义rnint bf_transaction(); //与xxx进行一次短连接,发送请求报文后接收响应报文rnint bf_connect(); //连接xxxrnrnconst char tran12345[] = rn rn "\rn \rn \rn xxxxxx\rn 123456\rn xxxxxx\rn 05\rn \rn xxxxxx\rn 01\rn \rn \rn \rn \rn \rn xxx\rn \rn \rn \rn xxxxxx\rn xxx\rn \rn \rn ";rnrnint main(int argc, char **argv) rnrn printf("start init...\n");rn //signal(SIGINT,SIG_IGN);rn //signal(SIGPIPE,SIG_IGN);rn //signal(SIGQUIT,SIG_IGN);rn ////signal(SIGTERM,EXIT);rn //signal(SIGUSR1,SIG_IGN);rn //signal(SIGCLD,SIG_IGN); rn if ( bf_init() == -1 )rn rn exit(1);rn rnrn if ( bf_transaction() == -1 )rn rn exit(1);rn rnrn return 0;rn rnrnint bf_init()rnrn struct sockaddr_in client_addr;rn bzero(&client_addr,sizeof(client_addr));rn client_addr.sin_family = AF_INET; //internet协议族rn client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址rn client_addr.sin_port = htons(0); //0表示让系统自动分配一个空闲端口 rnrn g_bf_socket = socket(AF_INET, SOCK_STREAM, 0);rn if ( g_bf_socket < 0 ) rn rn printf("Create Socket Failed!\n");rn return -1;rn rn elsern rn printf("Create Socket success.\n");rn rn if ( bind(g_bf_socket,(struct sockaddr*)&client_addr, sizeof(client_addr)) )rn rn printf("Client Bind Port Failed!\n"); rn return -1;rn rn elsern rn printf("bind success\n");rn rnrn bzero(&g_bf_addr, sizeof(g_bf_addr));rn g_bf_addr.sin_family = AF_INET; rn g_bf_addr.sin_addr.s_addr = inet_addr("192.168.10.146");rn g_bf_addr.sin_port = htons(BIG_FRONT_END_PORT); rnrnrnint bf_connect()rnrn if ( connect(g_bf_socket,(struct sockaddr*)&g_bf_addr, sizeof(g_bf_addr)) < 0 )rn rn return -1; rn rn rn return 0;rnrnrnrnint bf_transaction()rnrn char buffer[BUFFER_SIZE]; rn char szLen[5];rn int len, read_count;rnrn if ( bf_connect() == -1 )rn rn printf("connect fail.\n");rn return -1;rn rn elsern rn printf("connect success.\n");rn rn rn //发送4字节的请求报文长度rn bzero(szLen, sizeof(szLen));rn sprintf(szLen, "%04d", strlen(tran12345));rn len = send(g_bf_socket, szLen, 4, 0);rn printf("length:send content=[%s] real send length=[%d]\n", szLen, len);rn rn //发送请求报文体rn bzero(buffer, BUFFER_SIZE); rn strncpy(buffer, tran12345, strlen(tran12345));rn len = send(g_bf_socket, buffer, strlen(buffer), 0);rn printf("buffer length:%d, send length:%d\n", strlen(buffer), len);rnrn /*接收4字节的响应报文长度值*/rn bzero(szLen, sizeof(szLen));rn char sz[BUFFER_SIZE]=0;rn bzero(buffer, sizeof(buffer));rn read_count = recv(g_bf_socket, buffer, 4, 0);rn printf("need recv length=[%s] szLen=[%s]\n", read_count, szLen);rn rn //接收响应报文体rn bzero(buffer, BUFFER_SIZE); rn len = atoi(szLen);rn printf("len=[%d]\n", len);rn read_count = recv(g_bf_socket, buffer, len, 0); rn printf("response message length=[%d]\n", read_count);rn if ( read_count < 0 ) rn rn printf("Receive Data From xxx Failed!\n"); rn rn elsern rn printf("receive:%s\n", buffer);rn rnrn printf("one transaction cycle finish. app exit.\n"); rn close(g_bf_socket);rn g_bf_socket = -1;rnrnrn[/code]
多线程连接mysql出现段错误
在多线程中实例化mysql,连接时出现段错误,具体情况如下:rn */初始化mysqlmanagerrn MysqlManager(const string &_connect_url, bool _autocommit = true, bool _auto_reconect = false) rn this->connect_url = _connect_url;rn this->autocomit = _autocommit;rn this->auto_reconect = _auto_reconect;rn this->conn = nullptr;rn rn//连接到数据库rnvoid connect(const string &_userName, const string &_password) rn mysql::MySQL_Driver *driver;rn // 初始化驱动rn driver = sql::mysql::get_mysql_driver_instance();rn // 建立链接rn ConnectOptionsMap options;rn options["hostName"] = this->connect_url;rn options["userName"] = _userName;rn options["password"] = _password;rn options["OPT_RECONNECT"] = this->auto_reconect;rn options["OPT_CHARSET_NAME"] = "utf8";rnrn this->conn = driver->connect(options);rn this->conn->setAutoCommit(this->autocomit);rnrn cout << "connect mysql:"<connect_url << endl;rn rnrn多线程中:rnMysqlManager *mysql = new MysqlManager(MYSQL_URL);rn mysql->connect(MYSQL_USERNAME, MYSQL_PASSWORD);//此处出现段错误rnmysql版本为5.6.33 MySQL
多线程pthread_kill出现的莫名其妙的段错误
想实现:一个进程开启一个线程A,让线程A创建5个小线程abcde,线程A将任务给这5个小线程,如果某一个小线程运行结束,则在创建小线程来完成任务。但是框架却出问题了,有时候启动的时候程序就会出现段错误。有时候正常,如果正常ctrl+c,多试几次就能遇到段错误,求大神指导,代码贴上来[code=c]#include rn#include rn#include rn#include rnrnint test_search(pthread_t* pid)rnrn int pthread_kill_err;rn int i;rn for(i = 0; i < 5; i++)rn rn if(!pid[i] || ESRCH == pthread_kill(pid[i], 0))rn rn return i;rn rnrn //if(!pid[i])rn // return i;rn //pthread_kill_err = pthread_kill(pid[i], 0);rn //if(pthread_kill_err == ESRCH)rn //rn // //pid[i]=0L;rn // return i;rn //rn rn rn return -1;rnrnvoid* fun3()rnrn ;rnrnrnvoid* funn(void* arg)rnrnrn printf("come in\n");rn pthread_t *tid = (pthread_t*)arg;rn int j = 0;rn while(1)rn rn if(j<5)rn rn pthread_attr_t a;rn pthread_attr_init(&a);rn pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);rn pthread_create(&(tid[j]), &a, fun3, NULL);rn pthread_attr_destroy(&a);rn j++;rn rn elsern rn int ret = test_search(tid);rn if( ret >= 0)rn rn printf("ret = %d\n", ret);rn pthread_attr_t a;rn pthread_attr_init(&a);rn pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);rn pthread_create(&(tid[ret]), &a, fun3, NULL);rn pthread_attr_destroy(&a);rn rn rn rnrnrnint main()rnrnrnrn pthread_t pid[5];rn rn pthread_t pid2;rn pthread_attr_t a;rn pthread_attr_init(&a);rn pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);rnrn int ret = pthread_create(&pid2, &a, funn, (void*)(pid));rnrn pthread_attr_destroy(&a);rnrn while(1);rn return 0;rnrn[/code]rn编译gcc *.c -lpthread
socket网络编程多线程
#!/usr/bin/env python #-*-coding:utf-8-*- #多进程 import threading import time def thfun(): s=0 for i in range(30): s+=i time.sleep(0.1) print(s) class MyThread(threading.Thr
socket recv 返回-1什么原因?
客户端 循环向服务端send 数据封包,服务端 循环接收数据封包,recv 返回值有时候一直出现-1,后面的封包还没接收完,等一会后,recv 又能接收到数据了,过一会又会出现recv返回 -1,然后接着能继续接收数据,直到数据接收完。为什么在连续接收数据封包的过程中,recv 会出现返回值为-1 的情况?
网络recv返回-1问题
最近在学习directshow,网络实现视频传输,用的是TCPrnmSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);rnrn现在有个很奇怪的问题,就是我的视频显示界面在主显示器(PC是双显示器,左右屏幕):rn当在主显示器显示视频的时候,一切正常,拖动显示窗口也正常,运行N久也正常;可是一旦将显示视频界面拖动到副显示器(第二个显示器的时候),那么recv就返回-1,用Getlasterrro显示返回10053(VC解释为:你主机中的软件关闭掉了一个已建立的连接)。rn大家知道可能是什么原因么?
多线程的段错误
#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rnrnstruct nodernrn pthread_t tid;rn int num;rn sigset_t oldmask;rn sigset_t mask;rn;rnstruct node list[4];rnrnvoid* Deal(void* n)rnrn int choose=*(int*)n,signo;rn int err=sigwait(&list[choose].mask,&signo);rnrn if(signo==SIGUSR1) rn rn printf("wake up\n");rn printf("num is:%d",list[choose].num);rn rnrnrnint main()rnrn rn int i=0; rn rn for(;i<4;i++)rn rn printf("%d\n",i);rn sigemptyset(&list[i].mask);rn sigaddset(&list[i].mask,SIGUSR1);rn pthread_sigmask(SIG_BLOCK,&list[i].mask,&list[i].oldmask);rn list[i].num=i;rn pthread_create(&list[i].tid,NULL,Deal,(void*)(i));rn rnrn pthread_kill(list[3].tid,SIGUSR1);rnrnrn我第一次循环就段错误,怎么回事阿??求大虾指正
Socket网络编程1
Socket网络编程1
Socket网络编程 1
Socket网络编程 什么是网络编程 网络,计算机网络的构成? 在计算机领域中,网络是信息传输、接收、共享的虚拟平台。 局域网、互联网 什么是网络编程? 对信息的发送和接收。通过操作相关Api调度计算机硬件资源,并利用传输管道(网线)进行数据交换的过程。 网络模型、套接字、数据包 7层网络模型-OSI Sending Computer Reveiving Computer App...
select返回1,但是recv返回-1,err = 10035
fd_set rfds;rnstruct timeval tv;rnmemset( &tv, 0, sizeof(tv) );rntv.tv_usec = 20;rnint nRet = 0;rnint ncount = 0;rnchar szBuf[BUF_SIZE] = 0;rnFD_ZERO( &rfds );rnFD_SET( pClient->m_cliSocket, &rfds );rntryrnrn ncount = select(0, &rfds, NULL, NULL, &tv);rn if(0 == ncount)rn rn nRet = 0;rn rn else if ( ncount > 0 ) //have datarn rn if (FD_ISSET(pClient->m_cliSocket,&rfds)) //判断为假,recv无法执行rn rn ncount = recv( pClient->m_cliSocket, szBuf, sizeof(szBuf) - 1, 0 );rnrn以上是部分代码,select返回1,但是recv返回-1,错误码为10035rn这是什么情况?select返回1不是说明有数据可读吗?
线程卡在recv,怎么返回呢?
程序的线程卡在recv的,但是现在要按下按钮后返回线程,应该怎么做呢?有什么好的办法。
linux socket select返回1 recv返回-1
以下是部分代码:rnInt32 CServerNetComport::WaitRecvData(const Int32 fd)rnrn Int32 nRet;rn fd_set readfds; rn fd_set errfds;rn rn if(fd < 0)rn return ERR_OBJ;rn rn //将调用socket函数的描述符作为文件描述符rn FD_ZERO(&readfds);rn FD_ZERO(&errfds);rn FD_SET(fd, &readfds);rn FD_SET(fd, &errfds);rn rn struct timeval timeOut;rn timeOut = m_tRecvTimeOut;rnrn if (!CheckConnection(fd))rn rn FD_CLR(fd,&readfds);rn return COM_STATE_DISCON;rn rnrn nRet = select(fd+1, &readfds, NULL, &errfds, &timeOut);rnrn if (-1 == nRet) rn rn perror ("select");rn m_nFailure ++;rn FD_CLR(fd,&readfds);rn if (!CheckConnection(fd))rn rn return COM_STATE_DISCON;rn rnrn return ERR_COMM;rn rn else if(0 == nRet) rn rn FD_CLR(fd,&readfds);rn return ERR_TIMEOUT;rn rn rn if( FD_ISSET(fd, &errfds) )rn rn m_nFailure ++;rn return ERR_COMM;rn rnrn if (!FD_ISSET(fd, &readfds) ) rn rn m_nFailure ++;rn return ERR_COMM;rn rn rn FD_CLR(fd,&readfds);rn return ERR_NONE;rnrnrnInt32 CServerNetComport::ReceiveData(Int32 fd, PUint8 pRXData, Int32 &nRXLen)rnrn Int32 nCount=0;rn Int32 len = 0;rn rn if(fd < 0)rn return ERR_OBJ;rn rn nRXLen = 0;rnrn while(nCount < 3)rn rn len = recv(fd, pRXData+nRXLen, MAX_BUFFER_LEN-nRXLen, 0);rn rn if (len < 0)rn rn perror("recv");rn printf("errno=%d\n",errno);rn m_nFailure ++;rn if (!CheckConnection(fd) )rn rn return COM_STATE_DISCON;rn rn rn return ERR_OPER;rn rn rn nRXLen += len;rn rn if (nRXLen > MIN_DEALBUF_LEN*2)rn rn break;rn rn nCount++;rn usleep(300000);rn rn m_nFailure = 0;rn return ERR_NONE;rnrnrn这些是服务端代码,在开发板上跑,客户端是pc机上的网终调试助手。rn当select返回1时,调用recv如果非阻塞时返回-1,如果阻塞时一直等待,直到对方发送第三次数据时才返回,接收到的数据为三次发送的所有数据。rn求各位高人指点!
线程1:多线程的概念
进程:简单说是指在系统中正在运行的一个应用程序,通过资源管理器我们可以看到对进程的描述。线程:线程是系统分配处理器时间资源的基本单位。多线程技术使用环境:任务执行比较耗时的情况,也同时可以解决一些非常耗时的程序长时间占用cpu资源。定义一个多线程:(1)一般写法(2)lamda表达式(3)使用委托开启一个线程多线程的特点:(1)运行顺序不确定(2)线程之间平行执行using system.Thre...
多线程(1)-线程的终止方法
前言        近期看了一本关于多线程的书籍《Java多线程编程核心技术》。下面对学习到的关于线程的终止方法进行总结,如果有错误欢迎大家指出,如果对大家有帮助,欢迎转载和点赞。 概述      java中有三中方法终止正在运行的线程:      (1)、通过推退出标志,使线程正常退出,也就是当run方法完成后终止。      (2)、通过Thead.stop()方法强行终止线程,但是...
多线程1,线程基础知识
多线程基础知识 目录介绍 1.进程概述及多进程的意义[理解] 1.1 线程和进程 1.2 进程概述 1.3 多进程的意义 2.线程的概述和多线程的意义[理解] 2.1 什么是线程 2.2 多线程有什么意义 2.3 并行和并发 3.JVM运行原理以及JVM启动的线程探讨[理解] 3.1 Java程序运行原理 3.2 J...
Linux 多线程出现段错误 高手请进啊!
做了一个线程池,线程数在低于250个的时候,程序能正常运行rnrn但是将线程数设定多于250个以后,原来能正常运行的程序出现“段错误” 这是怎么回事? rnrn困扰我几天了
多线程ping程序出现“段错误”,求解
本程序主要实现同时测量到多个地址的延时值,用多线程实现。本程序在ipv4和ipv6环境下均适用,但主要目的是在ipv6环境下测时延。以下显示代码是程序的核心部分,但运行有错误,求高手相助!rn//initial 初始化 rn//send 发包 rn//recv 收包rn//proc 处理包,即取包中的数据,计算延时并显示rnvoid *initialsendrecvproc( struct addrinfo *ai )rn //为方便查找错误,本函数进行了简化,去掉了循环rn //只发一个ping包,然后接收该ping包的返回包rn //最后计算这两个包的时间差,并输出该时间差值rn int size;rn int nsent;rn char recvbuf[BUFSIZE];rn char controlbuf[BUFSIZE];rn struct msghdr msg;rn struct iovec iov;rn ssize_t n;rn struct timeval tval;rn rn struct proto *pr;rn rn if (ai->ai_family == AF_INET) //ipv4rn pr = &proto_v4;rn#ifdef IPV6rn else if (ai->ai_family == AF_INET6) //ipv6rn pr = &proto_v6;rn if (IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr)))rn err_quit("cannot ping IPv4-mapped IPv6 address");rn#endif rn elsern err_quit("unknown address family %d", ai->ai_family);rnrn pr->sasend = ai->ai_addr;rn pr->sarecv = Calloc(1, ai->ai_addrlen);rn pr->salen = ai->ai_addrlen;rnrn sockfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto); //使用原始套接字rn setuid(getuid());rn if (pr->finit)rn (*pr->finit)( );rn rn nsent = 0;rn size = 60 * 1024;rn setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));//设置套接字选项rnrn iov.iov_base = recvbuf;rn iov.iov_len = sizeof(recvbuf);rn msg.msg_name = pr->sarecv;rn msg.msg_iov = &iov;rn msg.msg_iovlen = 1;rn msg.msg_control = controlbuf;rnrn send_v6(pr, &nsent); //发一个包rn msg.msg_namelen = pr->salen;rn msg.msg_controllen = sizeof(controlbuf);rnrn n = recvmsg(sockfd, &msg, 0);//收上面刚发的包rn Gettimeofday(&tval, NULL);//得到当前时间rn proc_v6(recvbuf, n, &msg, &tval, pr);//处理包,计算延时并显示rnrn//标记1 printf(“hj\n”);rn pthread_exit(NULL);rn rnrnint main(int argc, char **argv)rnrn int i;rn struct addrinfo *ai;rn char *h;rnrn//ipaddress是一个纯文本文件,为排错方便,文件里只包含两行字符串rn//第一行是”www.google.com” 第二行是”www.kame.net”rn if ((fp1 = fopen("ipaddress","r")) == NULL)rn rn printf("cannot open infile\n");rn exit(0);rn rn rn while(!feof(fp1))rn rn fscanf(fp1,"%s",host); //host的定义语句为 char host[100]rn ai = Host_serv(host, NULL, 0, 0);rnrn h = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);rn printf("PING %s (%s): %d data bytes\n", ai->ai_canonname ? ai->ai_canonname : h, h, datalen);rnrn memset(&thread, 0, sizeof(thread));rn if (( pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)) != 0)rn rn printf("thread %d create fail!\n", i++);rn rn elsern rn printf("thread %d create success!\n", i++);rn rn//标记2 printf(“hj\n”);rn sleep(1);rn//标记3 printf(“hj\n”);rn rnrnrn程序想达到的效果是启两个线程,分别测试到www.google.com和www.kame.net 的延时,但以上程序执行的结果如下:rn[ root@ipv6measure hj]# gcc dxcpingipv6.c –o dxcpingipv6 –lpthread –lunp –grn[ root@ipv6measure hj]# chmod u+s dxcpingipv6rn[ root@ipv6measure hj]# ./dxcpingipv6rnPING www.google.com (2404:6800:4005:801::1013): 56 data bytesrn64 bytes from 2404:6800:4005:801::1013: seq=0, hlim=49, rtt=287.707 msrn[ root@ipv6measure hj]#rn也就是说第一个线程启动成功了,但第一个线程执行完了以后,整个程序就结束了。Main线程不再继续往下执行了,第二个线程也没有被创建。rn我在标记1处添加了一行printf(“hj\n”);结果程序运行结果如下rn[ root@ipv6measure hj]# ./dxcpingipv6rnPING www.google.com (2404:6800:4005:805::1011): 56 data bytesrn64 bytes from 2404:6800:4005:805::1011: seq=0, hlim=49, rtt=294.230 msrnhjrn[ root@ipv6measure hj]#rn这说明线程函数initialsendrecvproc(ai)能正常执行结束,那为什么第一个线程执行完了以后,整个程序就结束了?main线程为什么不再继续往下执行了?求高手指点!rnrn我尝试对程序作了一点修改,把标记1和标记1下面一行”pthread_exit(NULL);”注释掉了,重新运行程序,结果如下rn[ root@ipv6measure hj]# ./dxcpingipv6rnPING www.google.com (2404:6800:4005:803::1014): 56 data bytesrn64 bytes from 2404:6800:4005:803::1014: seq=0, hlim=49, rtt=295.691 msrnthread 0 create success!rn段错误rn[ root@ipv6measure hj]#rn这说明第一个线程启动后,main线程开始继续往下执行了,但出现了”段错误”。rn为确定”段错误”在哪一行产生的,我在标记2处加了一行printf(“hj\n”);结果程序运行结果如下rn[ root@ipv6measure hj]# ./dxcpingipv6rnPING www.google.com (2404:6800:4005:800::1010): 56 data bytesrn64 bytes from 2404:6800:4005:800::1010: seq=0, hlim=49, rtt=279.224 msrnthread 0 create success!rnhjrn段错误rn[ root@ipv6measure hj]#rn也就是说程序能执行完标记2这一行,然后报”段错误”rn我进一步修改,把标记2这一行注释掉,在标记3处加一行printf(“hj\n”);结果程序运行结果如下rn[ root@ipv6measure hj]# ./dxcpingipv6rnPING www.google.com (2404:6800:4005:803::1010): 56 data bytesrn64 bytes from 2404:6800:4005:803::1010: seq=0, hlim=49, rtt=284.096 msrnthread 0 create success!rn段错误rn[ root@ipv6measure hj]#rn这说明程序没有运行到标记3这一行就报”段错误”了!也就是说”段错误”出现在标记2行和标记3行之间,也就是sleep(1)这条语句处!但执行sleep(1)怎么会报”段错误”呢?求高手指点!rn
多线程中的RECV函数问题??
我想基于TCP/IP下建一个服务器和多个客户段,rn我在服务器是用多线程接收客户段传过来的消息,rn现在我的问题是当服务器接收一个客户发送过来的消息还好,当要是多个客户段传过来的消息时,就发生了阻塞,有没有那个大哥能帮我解决一下(我是利用创建单个线程跟客户连接的,既一个线程对应一个客户段)???
Java多线程---从线程中返回数据
从线程中返回数据 Callable接口获得线程的返回值 通过回调函数返回数据
Socket网络编程聊天,加多线程
------------------------------------------服务端   package org.demo.net.socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSo
SOCKET recv函数一直返回-1
socket新手,运行的时候,客户端能连接上,但是服务器一直显示recv函数一直返回-1,代码如下,谢谢各位老铁帮忙rnrnUINT rec(LPVOID p)rnrn CServeDlg *dlg;rn dlg = (CServeDlg*)AfxGetApp()->GetMainWnd();rn char msg[1024];rn int num;rn while (1)rn rnrn if (num = recv(clientsock, msg, 1024, 0) == -1)rn rn dlg->M_CSTRShow = "Receive error";rn dlg->UpdateData(false);rn return 0;rn rn CString message;rn message = msg;rn dlg->M_CSTRShow = dlg->M_CSTRShow + _T("serve:") + message + _T("\r\n");rn dlg->UpdateData(false);rn rn return 0;rnrnrnUINT lis(LPVOID p)rnrnrn CServeDlg *dlg = (CServeDlg*)AfxGetApp()->GetMainWnd();rn if (listen(servesock, 4) != 0)rn rn dlg->M_CSTRShow = dlg->M_CSTRShow + _T("listen error\r\n");rn dlg->UpdateData(false);rn return 0;rn rn elsern rn dlg->M_CSTRShow = dlg->M_CSTRShow + _T("listen success\r\n");rn dlg->UpdateData(false);rn rn while (1)rn rn int len = sizeof(SOCKADDR_IN);rn if (clientsock=accept(servesock, (sockaddr*)&clientaddr, &len) == INVALID_SOCKET)rn rn dlg->M_CSTRShow = dlg->M_CSTRShow + _T("accept error\r\n");rn dlg->UpdateData(false);rn break;rn rn elsern rn dlg->M_CSTRShow = dlg->M_CSTRShow + _T("accept success\r\n");rn dlg->UpdateData(false);rn AfxBeginThread(&rec, 0);rn rn rn return 0;rnrnrnvoid CServeDlg::OnBnClickedBtncreat()rnrn WSADATA wsa;rn if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)rn rn M_CSTRShow = "Wsadata error";rn UpdateData(false);rn return;rn rn servesock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);rn if (servesock == INVALID_SOCKET)rn rn M_CSTRShow =M_CSTRShow+ _T("Wsadata error\r\n");rn UpdateData(false);rn return;rn rn SOCKADDR_IN serveaddr;rn serveaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);rn serveaddr.sin_family = AF_INET;rn serveaddr.sin_port = htons(8260);rn if (bind(servesock, (sockaddr*)&serveaddr, sizeof(SOCKADDR_IN)) != 0)rn rn M_CSTRShow = M_CSTRShow + _T("bind error\r\n");rn UpdateData(false);rn return;rn rn AfxBeginThread(&lis, 0);rn // TODO: 在此添加控件通知处理程序代码rn
recv返回-1后errno和WSAGetLastError的错误处理
    首先errno函数是linux系统里面的,windows系统对应的要用WSAGetLastError函数。     官方详解如下链接:https://msdn.microsoft.com/zh-cn/windows/ms737828(v=vs.95)     Error codes set by Windows Sockets are not made available throug...
编译中出现段错误的解决方法
需要考虑一下因素: 1、出现段错误时,首先应该想到段错误的定义,从它出发考虑引发错误的原因。 2、在使用指针时,定义了指针后记得初始化指针,在使用的时候记得判断是否为NULL。 3、在使用数组时,注意数组是否被初始化,数组下标是否越界,数组元素是否存在等。 4、在访问变量时,注意变量所占地址空间是否已经被程序释放掉。 5、在处理变量时,注意变量的格式控制是否合理等。...
linux多线程,段错误?
正在学习多线程,写了个例子确老告诉我段错误。经过跟踪发现是调用pthread_join时出错了。请问为什么?rn#include rn#include rnrnvoid *thr_fn1(void *arg)rnrn printf("pthread1 returning.\n");rn return ((void *)1);rnrnrnvoid *thr_fn2(void *arg)rnrn printf("pthread2 existing.\n");rn return ((void *)2);rnrnrnint main()rnrn void *tret;rn pthread_t tid1,tid2;rnrn tid1=pthread_create(&tid1,NULL,thr_fn1,NULL);rn tid2=pthread_create(&tid2,NULL,thr_fn2,NULL);rn //pthread_join(tid1,&tret);rn printf("thread1 exit code %d\n",(int)tret);rn //pthread_join(tid2,&tret);rn printf("thread2 exit code %d\n",(int)tret);rn exit(0);rn
gcc 调试中出现 段错误
rn#includernrnint zheban(int a[] ,int n,int k)rn int low,high,mid;rn low=0;high=n-1;rn while(low<=high)rn mid=(low+high)/2;rn if(a[mid]>k) high=mid-1;rn else if(a[mid]=k) return(mid);rn else low=mid+1;rnrn return -1;rnrnrnint main()rnrn int a[8]=10,23,33,45,43,13,67,84;rn int k,i;rn scanf("%d",&k);rn zheban(a,8,k);rn if(i!= -1)rn printf("a[%d]=%d\n",i,a[i]);//gdb 调试此处出现错误rn elsern printf("not found");rnrn
紧急求教!多线程+段错误!
程序如下:rn 子线程A:从一个文件夹中不断读取文件,创建一个工作队列rn 子线程集合B: 包含若干个线程,试图从上述工作队列中竞争取出工作队列的第一个文件进行处理。rn 问题:rn 每次集合B中的一个线程取工作队列的第一个文件后试图从工作队列里删掉这个文件,总是会删不掉。而且总会出现段错误。rn P.S.,其中mutex定义在主线程的中,是全局变量,这样A和B(不在同一个文件里)都能用这个mutex来锁定工作队;rn 工作队列我自己写的一个简单容器,类似链表,pop_front()删除并返回第一个元素,push_back()插入末尾rnrn大家帮我看看我的这个程序哪里有问题?或者该怎么设计?rnrn //集合B中的工作线程取文件的函数rnvoid B::reload()rn extern pthread_mutex_t mutex;rn pthread_mutex_lock(&mutex);rnrn if(NULL != this->filesource->getDirLoad().first)//getDirLoad()返回的就是工作队列rn this->MediatorWorkLoad=this->filesource->getDirLoad().pop_front();rn cout<<"reload success with input "<MediatorWorkLoad<sourceDir);rn const char* tmp1=".";rn const char* tmp2="..";rn string filename("");rnrn while(MediationRunning)//这个线程是死循环,除非MediationRunning为true,初始化为falsern if(NULL != ptr)rn filename=ptr->d_name;rn if((tmp1 != filename) && (tmp2 != filename)) rn rn extern pthread_mutex_t mutex;rn pthread_mutex_lock(&mutex);rnrn this->DirWorkLoad.push_back(filename); rnrn pthread_mutex_unlock(&mutex);rn rn //end if(tmp1 != filename && tmp2 != filename)rn ptr=readdir(this->sourceDir);rn //end if(NULL !=ptr)rn else rn this->closeSourceDir();//先关闭,等待新的文件进入文件夹rn sleep(refreshPeriod);rn this->openSourceDir();//重新打开rn ptr=readdir(this->sourceDir); rn rn //end while(MediationRunning)rn //end tryrn catch (exception e)rn throw runtime_error("in/out file operations error");rn rn pthread_exit(NULL);rnrn
多线程爬虫(1)-简单线程和面向对象线程
1.python线程的简单使用 import time import threading def sing(a): for x in range(1,6): print('%s接收过来的参数%s'%(threading.current_thread().name,a)) print('我在唱什么') time.sleep(1) def ...
WinSocket的问题:Recv返回-1,WSAGetLastError 返回 0
在windows socket编程中遇到这样一个问题:rn当前的socket是阻塞模式,recv在一段较长时间(30S)没有接收到数据后,返回-1(SOCKET_ERROR),使用WSAGetLastError去获得错误值,返回的却是0.rn这个时候是不是Recv的超时错误,对这样的错误,应该如何处理?rn谢谢。
多线程(1)传统线程回顾
本文介绍的传统线程的回顾 是Java1.5之前回顾,你可以选择跳过。 Thread类即线程类 一线程的创建   1.1通过new Thread写出子类重写run方法 Thread thread = new Thread(){ public void run(){System.out.println(&quot;&quot;)}; };  thread.start(); 即可运行thread里面的...
java多线程1(任务、线程)
这里我们先来看看一些概念: 1、任务:任务可以简单的理解为一段代码,一个类的一个方法或者多个方法去做一件和多件事情,这就是任务,这段代码,方法你怎么写,写在哪里都可以。 package test3; public class MainTest { public static void main(String[] args) { System.out.println("输出任务"); } }
多线程学习笔记(1)线程安全问题
什么是线程安全问题?答:当多个线程共享同一个全局变量。在做写操作的时候,可能会受到其他线程的干扰,导致数据有问题,这种现象叫做线程安全问题。(多个线程共享同一个局部变量,在做写操作的时候,不会发生线程安全问题)class TrianThread1 implements Runnable { //总共有一百张火车票 private int i =100; @Override public...
Java多线程1:进程与线程
1.什么是进程?进程是操作系统结构的基础,是一次程序的执行,是系统进行资源分配和调度的一个独立单位。 这个解释有点懵了。简单来讲就是一个正在操作系统中的运行的exe程序就是一个进程。2.什么是线程?线程可以理解为是在进程中独立运行的子任务。比如:酷狗音乐.exe运行时,就会有很多子任务在同时运行,包括下载歌词线程,直播线程等3.线程的优点可以在同一时间内运行更多不同种类的任务,比如作为程序员,我们
WinSocket的问题:非阻塞模式recv返回-1,WSAGetLastError 返回 0
尝试非阻塞的socket编程,碰到WSAGetLastError()一直是返回值为0的问题,百度了几个博客,都说是因为WSAGetLastError()的调用必须及时,不能被其他的系统调用隔开,否则得到的错误值被掩盖。rn 如博客: [url=http://blog.csdn.net/tianbaowen/article/details/8485567][/url]rn 然而,我的代码在recv()后紧跟着的系统调用就是WSAGetLastError(),却依然得到的是返回值0。最后上了国外的网站看,有人说是需要直接调用GetLastError()就可以,结果一改,果然就得到了10035,现在还不知道为何。。。rnrn[code=c]rnDWORD IniSOCKDLL()rnrn WORD wVersionRequested;rn WSADATA wsaData;rn int err=0;rnrn wVersionRequested = MAKEWORD( 2, 2 );rn err = WSAStartup( wVersionRequested, &wsaData ); rn if(err != 0)rn return err;rn if ( LOBYTE( wsaData.wVersion ) != 2 ||rn HIBYTE( wsaData.wVersion ) != 2 ) rn WSACleanup( );rn err = -1;rn rn return err;rnrnrnint main()rnrn int status;rn IniSOCKDLL();rn SOCKET sc=socket(AF_INET,SOCK_STREAM,0);rn rn SOCKADDR_IN addr;rn int len;rn addr.sin_family=AF_INET;rn addr.sin_addr.s_addr = inet_addr("127.0.0.1");rn addr.sin_port = htons(21050);rn len = sizeof(addr);rn cout << "start client" << endl;rn status = ::connect(sc, (struct sockaddr *)&addr, len);//server已开启,连接server端rnrn char buff[1024];rn ZeroMemory(buff,1024); rn memcpy(buff,"linking",7);rnrnrn u_long iMode = 1;//非阻塞模式rn ioctlsocket(sc, FIONBIO, &iMode);//设置套接字sc为非阻塞模式rn len = send(sc,buff, strlen(buff),0);rn while(!quit)rn len = recv(sc, buff, 1024, 0);rn if(len < 0)rn int err = GetLastError();//改成这个就好使; 用WSAGetLastError()就一直是0rn if(err == WSAENETDOWN || err == WSAECONNRESET || err == WSAENOTCONN)//断线重连rn closesocket(sc);rn sc = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, NULL);rn int status = ::connect(sc, (struct sockaddr *)&addr, sizeof(addr));rn if(status < 0)rn Sleep(3000);rn elsern memcpy(buff,"linking",7);rn ioctlsocket(sc, FIONBIO, &iMode);rn send(sc,buff,7,0);rn rn else if(err == WSAEWOULDBLOCK)rn Sleep(10);rn rn continue;rn rn send(sc, "received", strlen("received"), 0);rn if(strncmp(buff,"left",4) ==0)rn cout << "left" << endl;rn else if(strncmp(buff,"right",5)==0)rn cout << "right" << endl;rn rn ZeroMemory(buff, 1024);rnrn //whilernrn closesocket(sc);rn cout << "stopped..." << endl;rn return 0;rnrn[/code]
线程(1)多线程创建的方式
创建线程的两种方式 第一种:继承Thread类。第二种:实现Runable接口, 创建一个实现Runable的类或是继承Thread类子类的实例,重写run方法,方法体中的内容就是新线程要执行的业务逻辑代码,创建该类的实例,并根据此类创建一个具体的Thread实例,该实例调用start方法就实现了新线程的启动 (1)通过实现Runable接口实现的方式 public class NewTh
recv返回问题?
请教各位大侠rn用非阻塞模式时,用recv返回。。我想测试下缓冲区有多大。。rn就设置了buf<8k,>8k的几种情况,可是recv返回值都是我设置的buf的大小,rn不是说recv返回的是缓冲区拷贝到buf中的大小嘛??那么最多也只可能返回缓冲区的大小8k?16k?rn可是结果不管我怎么测试都是buf的大小。。。之前在同一台电脑上测,百度出可能是因为127.0.0.01,数据没有经过缓冲区。。现在环境:服务器在虚拟机上,虚拟机网络连接采用的是桥接。。buf也有memset了rn结果还是一样。。故请教各位recv中的buf跟缓冲区的关系?
recv返回10053错误
客户端和服务器端进行通信,客户端send,服务器端recv,当send的数据长度小于某个值时recv正确,但当send的数据长度过大时recv不到数据,返回10053的错误,这是咋回事啊?
阻塞 recv返回10035
我程序为什么经常出现这个问题啊!阻塞 recv还是返回10035 。
TCP socket recv返回-1,WSAGetLastError()返回10054或10053
我的程序跑的是个播放器,然后连接一个摄像头进行播放。现在是拔掉网线后出错,recv返回-1,WSAGetLastError()返回10054或10053。从断网线和程序报错是有个间隔时间的。我想问这个时间是哪里设置的?
Socket网络编程学习笔记(1)
Socket网络编程学习笔记 C# yuanma
Socket网络编程学习笔记(1)
Socket网络编程学习笔记(1):常用方法介绍
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法