【问题标题】:error in client server udp c客户端服务器 udp c 中的错误
【发布时间】:2012-12-08 03:07:10
【问题描述】:

我想在两台使用客户端的电脑和使用 C 的服务器之间建立连接 我已经能够从客户端发送数据并由服务器接收。 但是当服务器要发送数据时,服务器端会出现错误: 分割失败:11

这是我的程序: 在客户端:

#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;
}

有什么建议吗?

【问题讨论】:

  • 使用gdb当然可以找到where出现段错误。
  • 感谢我是 gcc 的初学者,所以我不懂调试。但我会使用 gdb

标签: c udp client-server


【解决方案1】:

进行调试构建(选项 -g),然后调用 gdb。它会在您使用的地方打开一个提示

file "a.out"

加载可执行文件,然后调用“运行”以在调试器的控制下实际运行您的程序。当段错误发生时,调用“backtrace”,它应该会告诉你函数以及它发生的行。

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

【讨论】:

  • 我像“hai”一样从客户端发送并在服务器中接收良好。但是当服务器发送“你好”时,客户端无法接收它。我在服务器端使用 gcc。如何使用 gcc 进行调试,因为我是 gcc 的初学者
  • 好的,你如何构建你的代码?您使用任何 IDE 还是从命令行调用编译器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多