首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

socket 编程遇到的有关问题 求

2012-05-07 
socket 编程遇到的问题 求高手指点服务器端代码:#include socket_connect.hstruct sockaddr_in server,s

socket 编程遇到的问题 求高手指点
服务器端代码:
 #include "socket_connect.h"  
 struct sockaddr_in server,sink_addr;
 void socket_connect_init(int *sockfd,unsigned short port)  
  {  
  int sock;  
   
  int structlength;  
  
  memset((char *)&server,0,sizeof(server));  
  server.sin_family = AF_INET;  
  server.sin_addr.s_addr = htonl(INADDR_ANY);  
  server.sin_port = htons(port);  
  
  bzero(&sink_addr, sizeof(sink_addr));
sink_addr.sin_family = AF_INET;
sink_addr.sin_port = htons(port);
sink_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

  if((sock = socket (AF_INET,SOCK_DGRAM,0)) < 0 ){  
  printf("socket create error!\n");  
  exit(1);  
  }  
   
  structlength = sizeof(server);  
  if( bind(sock,(struct sockaddr *) &server,structlength) < 0){  
  printf("socket bind error!\n");  
  perror("bind");  
  exit(1);  
  }  
  *sockfd = sock;  
  }  
 void socket_connect_recv(int sock,struct sockaddr_in *client,char *msg,int len)  
  {  
  memset(client,0,sizeof(struct sockaddr_in));  
  int structlength = sizeof(struct sockaddr_in);  
  int recvd = recvfrom(sock,msg,len,0,(struct sockaddr *) client,&structlength);  
  if(recvd < 0){  
  perror("recvfrom");  
  exit(EXIT_FAILURE);  
  }  
  else{  
  msg[recvd] = '\0';  
  }  
  }  
 void socket_connect_send(int sock,char *buff,int size){  
  //int structlength = sizeof(struct sockaddr_in);  
  //int snd = sendto(sock,msg,len,0,(struct sockaddr *) client,structlength);
int snd = sendto(sock, buff, size, 0, (struct sockaddr *)&sink_addr, sizeof(struct sockaddr));  
  if(snd < 0){  
  perror("sendto");  
  exit(1);  
  } 
 }  
   
 void socket_connect_close(int sockfd){  
  close(sockfd);  
 }  
服务器端主函数:
 #include <stdio.h>  
 #include "socket_connect.h"  
 int main(){  
   
  int sock;  
  struct sockaddr_in client;  
  char msg[20]="11111111";  
  socket_connect_init(&sock,8000);  
  while(1)  
  {  
   
  //socket_connect_recv(sock,&client,msg,sizeof(msg));
printf("The send msg is %s\n",msg);  
  socket_connect_send(sock,msg,sizeof(msg));  
  }  
  socket_connect_close(sock);  

客户端代码:
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h>


#include <string.h>

#define PORT 8000 /* Server的端口 */
#define MAXDATASIZE 100 /*一次可以读的最大字节数 */

int main(int argc, char *argv[]) 


int sockfd, numbytes, sin_size; 

char buf[MAXDATASIZE] = "Hello, world!"; 

struct sockaddr_in their_addr; /* 对方地址信息 */

if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)

perror("socket"); 
exit(1); 
}

their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT); 
their_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
bzero(&(their_addr.sin_zero), 8);
char i = 1;
while(i<10)
{
//numbytes = sendto(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&their_addr,sizeof(their_addr));
//if (numbytes == -1)
//{
//perror("sendto"); 
//exit(1); 
//}
//printf("Send: %s\n",buf);
numbytes = recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);

if (numbytes == -1)

perror("recvfrom"); 
exit(1); 
}
buf[numbytes] = '\0'; 
printf("Received:%s\n",buf); 
i++;

close(sockfd); 

return 0; 
}
程序运行的时候,我先运行服务器端的代码,然后再运行客户端的代码,但是客户端始终接受不到服务器端发过来的信息!不知道问题出现自那里,请高手给予指点!

[解决办法]
我肿么没看到服务器开"监听"的函数啊?
[解决办法]

探讨

我肿么没看到服务器开"监听"的函数啊?

[解决办法]
客户端没有bind,客户端每次发数据都用不同的端口(打一枪换一个地方)
当然收不到服务器端给的回应了。
[解决办法]
探讨

我是不是应该在客户端里面添加一个bind函数啊
引用:
引用:

我肿么没看到服务器开"监听"的函数啊?

这是UDP,不需要Listen

[解决办法]
。。。

楼主弄反了,服务端主送发包了。。。

客户端反而没有bind。。。
[解决办法]
common.h
C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <pthread.h>#include <fcntl.h>#include <errno.h>#include <signal.h>#include <linux/types.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/time.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <ctype.h>static int init_listener(int *sd, int port){    struct sockaddr_in thisaddr;    *sd = socket(AF_INET, SOCK_DGRAM, 0);    memset(&thisaddr, 0, sizeof(thisaddr));    thisaddr.sin_family = AF_INET;    thisaddr.sin_addr.s_addr = htonl(INADDR_ANY);    thisaddr.sin_port = htons(port);        if(bind(*sd, (struct sockaddr *)&thisaddr, sizeof(thisaddr)) == -1) {        perror("bind error");        return -1;    }    return 0;} 

热点排行