C网络编程读取服务器数据时,出现段错误(使用的线程处理函数)

李小嘉 发布于 2015/10/28 16:12
阅读 107
收藏 0
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#define SERPORT 50008
#define SIZE 1024


void *routine(void *arg)
{
int fd = (int)arg;
char buf[SIZE];
while(1)
{
bzero(buf, SIZE);
int nbytes;
if((nbytes = read(fd, buf, SIZE)) < 0)
{
fprintf(stderr, "recvmsg error!\n");
exit(1);
}
//buf[nbytes] = '\0';
printf("form server:%s", buf);
}
pthread_exit(NULL);
}
int main(int argc, char const *argv[])
{
int clientfd;
if(argc != 2)
{
printf("usage: %s <IP>\n", argv[0]);
exit(0);
}
if((clientfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Socket error!\n");
exit(0);
}
struct sockaddr_in srvaddr;
socklen_t len = sizeof(srvaddr);
bzero(&srvaddr, len);


srvaddr.sin_family = AF_INET;
inet_pton(AF_INET, argv[0], &srvaddr.sin_addr);
srvaddr.sin_port = htons(SERPORT);
if(connect(clientfd, (struct sockaddr *)(&srvaddr), len) == -1)
{
printf("Connect error!\n");
exit(0);
}
#if 0
int nbytes = 0;
char sendline[MAXLINE], recvline[MAXLINE];


while(fgets(sendline, MAXLINE, stdin) != NULL)
{
write(clientfd, sendline, strlen(sendline));
if((nbytes = read(clientfd, recvline, MAXLINE)) == 0){
fprintf(stderr, "str_cli:server terminated prematurely\n");
exit(1);
}
recvline[nbytes] = '\0';
fputs(recvline, stdout);
}


#endif
pthread_t tid;
pthread_create(tid, NULL, routine, (void *)clientfd);


char buf[SIZE];
while(1)
{
bzero(buf, SIZE);
if(fgets(buf, SIZE, stdin) == NULL || 
!strcmp(buf, "quit\n"));
write(clientfd, buf, strlen(buf));
}
pthread_join(tid, NULL);


close(clientfd);
return 0;

}

运行结果:段错误,GDB调试查到问题点在于线程处理函数那里,我搞不懂哪里出问题了;read函数不是阻塞等待的么?

以下是问题补充:

@李小嘉:条件编译那一段代码是可以正常运行的 (2015/10/28 16:13)
加载中
0
大梦1107
大梦1107

if((nbytes = read(fd, buf, SIZE)) < 0)
{
    fprintf(stderr, "recvmsg error!\n");
    exit(1);
}
//buf[nbytes] = '\0';
printf("form server:%s", buf);

你有没有发现读buf会越界呢。虽然这并不是coredump原因。

李小嘉
李小嘉
我找到bug在哪里,是现在创建出问题了
返回顶部
顶部