系统是Macintosh Yosemite,编译器gcc
实验的基本内容是客户端发消息,服务器端回显,
这里做在同一台电脑上用两个终端联系,
- 第一次学这个,速度比较慢,弄了一晚上做出来了,回显一切正确。
但是接下来麻烦来了
- 第二天增加功能之前,测试了一下昨天的成果,结果试了多少遍,回显一直有问题。

客户端显示莫名其妙的字符(好像是之前测试输入的。。跟本次输入完全没有关系)
用很原始的调试方法发现,客户端显示的东西完全不是服务器端返回的(服务器端get sendline!这句话根本就不执行。。。)
- 于是我用ubuntu虚拟机跑了一遍这个程序,第一遍okay,仅仅是重启了一下,又跟mac下一模一样了!!!
- 哭死。。。。
是我代码的问题还是电脑的问题
能帮我解释一下为什么么?十分感谢!
最后附代码
/*
* udpcli01.cpp
*
* Created on: 2015年4月23日
* Author: gzxultra
*/
#include <netinet/in.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#define MAXLINE 4096
#define LISTENQ 1024 /* 2nd argument to listen() */
#define SERV_PORT 9877
#define SA struct sockaddr
void dg_cli(FILE *, int, const SA *, socklen_t);
int
main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
if (argc != 2) {
printf("usage:udpcli01sigio <IPaddress>\n");
exit(1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0) {
printf("socket error.\n");
exit(1);
}
dg_cli(stdin, sockfd, (SA *)&servaddr, sizeof(servaddr));
exit(0);
}
void
dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE + 1];
//struct sockaddr_in from;
while (fgets(sendline, MAXLINE,fp) != NULL) {
sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);
recvline[n] = 0; /* null terminate */
fputs(recvline, stdout);
memset(sendline,0,sizeof(sendline));
memset(recvline,0,sizeof(recvline));
}
}
/*
* udpserv01.cpp
*
* Created on: 2015年4月23日
* Author: gzxultra
*/
#include <netinet/in.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAXLINE 4096
#define LISTENQ 1024 /* 2nd argument to listen() */
#define SERV_PORT 9877
#define SA struct sockaddr
#include <string.h>
static int sockfd;
void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen, char *mesg);
//void GetList(int sockfd, SA *pcliaddr, socklen_t clilen) ;
int main(int argc, char ** argv) {
struct sockaddr_in servaddr, cliaddr;
//使用socket()函数生成套接字文件描述符
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
printf("socket error.\n");
exit(1);
}
//printf("I am not dead!\n");
//设置服务器地址和侦听端口,初始化要绑定的网络地址结构
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET; //地址类型为AF_INET
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //任意本地地址
servaddr.sin_port = htons(SERV_PORT); //服务器端口
//绑定侦听端口
bind(sockfd, (SA *) &servaddr, sizeof(servaddr));
/*
char instruction[3][10] = {
"getlist\0",
"download\0",
"upload\0"
};
*/
int op = 0;
int i = 0,j = 0;
int n = 0;
char mesg[MAXLINE];
socklen_t len = sizeof(cliaddr);
printf("running here!\n");
while(1){
//len = clilen;
//recvfrom接收客户端的网络数据
//printf("running here2!\n");
n = recvfrom(sockfd, mesg, MAXLINE, 0, (SA *) &cliaddr, &len);
printf("get sendline!\n");
dg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr), mesg);
printf("echo done!\n");
}
}
void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen, char *mesg) {
sendto(sockfd, mesg, sizeof(mesg), 0, pcliaddr, clilen);
}