2012-12-08 45 views
0

我想建立两个pc之间使用客户端和服务器使用C之间的连接C 我已经能够发送数据从客户端和服务器接收。 但是当服务器要发送的数据错误是出现在服务器端: 分割失败:11错误在客户端服务器udp c

这里我的程序: 客户端:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#define MYPORT 4950 
#define MAXBUFLEN 100 

int main() { 
    char no[16], dt[30]; 
    printf("‐‐‐‐‐ PROGRAM CHATTING ‐‐‐‐‐\n"); 
    printf("To : "); 
    scanf("%s", no); 
    while(1){ 
     printf("Me : "); 
     scanf("%s", dt); send(no, dt); receive(); 
    } 
} 

int send(char no[], char dt[]) 
{ 
int sockfd; 
struct sockaddr_in my_addr; 
struct sockaddr_in their_addr; 
struct hostent *he; 

int addr_len, numbytes; 
if((he = gethostbyname(no)) == NULL) 
{ 
    perror("gethostbyname"); 
    exit(1); 
} 
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1) 
{ //40 
    perror("socket"); 
    exit(1); 
} 
their_addr.sin_family = AF_INET; 

their_addr.sin_port = htons(MYPORT); 
their_addr.sin_addr=*((struct in_addr*)he->h_addr); 
memset(&(their_addr.sin_zero), '\0', 8); 
if((numbytes=sendto(sockfd,dt,strlen(dt),0,(struct sockaddr*)&their_addr,sizeof(struct sockaddr)))==-1) 
    { 
    perror("sendto"); 
    exit(1); 
} 
close(sockfd); 
return 0; 
} 

int receive() 
{ 
    int sockfd; 

struct sockaddr_in my_addr; 
struct sockaddr_in their_addr; 
struct hostent *he; 

int addr_len, numbytes; 
char buf[MAXBUFLEN]; 
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1) //68 
{ 
    perror("socket"); 
    exit(1); 
} 
my_addr.sin_family = AF_INET; 
my_addr.sin_port = htons(MYPORT); 
my_addr.sin_addr.s_addr = INADDR_ANY; memset(&(my_addr.sin_zero),'\0',8); 
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1) 
{ 
    perror("bind"); 
    exit(1); 
} 
addr_len = sizeof(struct sockaddr); 
if((numbytes=recvfrom(sockfd,buf,MAXBUFLEN-1,0,(struct sockaddr *)&their_addr,&addr_len))==-1) 
{ 
    perror("recvfrom"); 
    exit(1); } 
buf[numbytes]='\0'; 

printf("%s : \"%s\"\n", inet_ntoa(their_addr.sin_addr), buf); 
close(sockfd); 
return 0; 
} 

和服务器:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#define MYPORT 4950 
#define MAXBUFLEN 100 
char noip[50]; 
int main() 
{ 
char no[16]; 
char dt[30]; 
printf("‐‐‐‐‐ PROGRAM CHATTING ‐‐‐‐‐\n"); 
receive(); 
strcpy (no, noip); 
while(1){ 
    printf("Me : "); 
    scanf("%s", dt); 
    send(dt); 
    receive(); 
    } 
} 

int send(char dt[30]) { 
    int sockfd; 
    struct sockaddr_in my_addr; 
    struct sockaddr_in their_addr; 
    struct hostent *he; 
    int addr_len, numbytes; 

if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){ 
     perror("socket"); 
     exit(1); 
    } 
    their_addr.sin_family = AF_INET; 
    their_addr.sin_port = htons(MYPORT); 
their_addr.sin_addr=*((struct in_addr*)he->h_addr); 
memset(&(their_addr.sin_zero), '\0', 8); 
if((numbytes=sendto(sockfd,dt,strlen(dt),0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr)))==-1)   
     { 
     perror("sendto"); 
     exit(1); } 
    close(sockfd); 
    return 0; } 

int receive() { 
int sockfd; 
struct sockaddr_in my_addr; 
struct sockaddr_in their_addr; 
struct hostent *he; 
int addr_len, numbytes; 
char buf[MAXBUFLEN]; 
char no[16]; 

if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){ 
     perror("socket"); 
     exit(1); } 

my_addr.sin_family = AF_INET; 
my_addr.sin_port = htons(MYPORT); 
my_addr.sin_addr.s_addr = INADDR_ANY; 
memset(&(my_addr.sin_zero),'\0',8); 

if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){ 
     perror("bind"); 
     exit(1); } 

addr_len = sizeof(struct sockaddr); 
if((numbytes=recvfrom(sockfd,buf,MAXBUFLEN-1,0,(struct sockaddr *)&their_addr,&addr_len))==-1) 
{ 
    perror("recvfrom"); 
    exit(1);} 

buf[numbytes]='\0'; 
printf("%s : \"%s\"\n", inet_ntoa(their_addr.sin_addr), buf); 
strcpy(no,inet_ntoa(their_addr.sin_addr));//copy data ke varibel no 
     close(sockfd); 
     return 0; 
} 

任何消化?

+1

使用'gdb'当然可以找到段落发生的地方。 – soulseekah

+0

感谢我在gcc的初学者,所以我不明白要调试。但是我会使用gdb – Limavolt

回答

0

执行调试构建(选项-g),然后调用gdb。它打开,你用

file "a.out" 

加载可执行文件和事后所说的“跑”到实际运行您调试器的控制下进行编程的提示。当段错误发生时,调用“回溯”,它应该告诉你函数,也许它发生的地方。

但是当我看到代码时,我的第一个猜测就是输入字符数组。发送时是否输入超过29个字符? ;)

+0

我从客户端发送像“hai”,并在服务器中收到良好。但是当服务器发送“hallo”时,客户端无法收到它。我在服务器端使用gcc。如何使用gcc进行调试,因为我是gcc的初学者 – Limavolt

+0

好吧,你如何构建你的代码?您是否使用任何IDE或从命令行调用编译器? –

+0

在我的服务器电脑中,我使用终端/命令行 – Limavolt