实验的基本内容是客户端发消息,服务器端回显,
这里做在同一台电脑上用两个终端联系,
但是接下来麻烦来了
客户端显示莫名其妙的字符(好像是之前测试输入的。。跟本次输入完全没有关系)
用很原始的调试方法发现,客户端显示的东西完全不是服务器端返回的(服务器端get sendline!这句话根本就不执行。。。)
是我代码的问题还是电脑的问题
能帮我解释一下为什么么?十分感谢!
最后附代码
/*
* 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);
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.