100分求解C语言UDP发送数据详细过程

kres520 2009-01-24 10:43:22
我是新手,希望给位高手不吝赐教,请帮忙写下注释每一句都是干什么用的,越详细越好。。。搜了半天也没看懂

问题1:请帮忙写下注释
-----------------------SERVER----------------------

#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>

#define MAXLINE 80
#define SERV_PORT 6000

void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];

for(;;)
{
len = clilen;
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
/* sent data back to client */
sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}

int main(void)
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;

sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */

/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
exit(1);
}

do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));

return 0;
}


问题2:下面程序错在哪了
下面是我写的一个Client,编译没问题(Linux下),好像发送不出去数据,大家帮忙看看,实在是不明白
我就是想给192.168.0.123这个IP发送数据。
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>

#define MAXLINE 80
#define SERV_PORT 6000


int main()
{
int sockfd;
struct sockaddr_in servaddr,addr2;
unsigned long l2;
char pData[]="l|100000|loginsucessful|";

/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

l2 = inet_addr("192.168.0.123");
memcpy(&addr2, &l2, 4);
sendto(sockfd,&pData,sizeof(pData),0,(struct sockaddr *)&addr2,sizeof(addr2));

return 0;
}

问题3:如果SERVER和Client这两端代码再同一程序(代码)中,如何将SERVER中获得的IP提出来,让Client去发送给这个提出来的IP。比如192.168.0.123发过来一段数据,接收后再转发给192.168.0.123。麻烦写下详细代码,最好可运行

三个问题,谢谢了!!!
...全文
1226 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
海中水草 2011-10-28
  • 打赏
  • 举报
回复
可以边做边学习,呵呵
Linux_Video 2011-02-28
  • 打赏
  • 举报
回复
up up
liangbingyihao 2010-09-14
  • 打赏
  • 举报
回复
同来学习学习
  • 打赏
  • 举报
回复
1.楼主真有钱
2.学习了
pauliuyou 2009-01-24
  • 打赏
  • 举报
回复

#include <winsock.h>
#include <stdio.h>

#define MAXLINE 80
#define SERV_PORT 7000

void do_echo(int sockfd, struct sockaddr *pcliaddr)
{
int n;
int len = sizeof(struct sockaddr);
char mesg[MAXLINE];

for(;;)
{
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
printf("%s\n",mesg);
/* sent data back to client */
sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}

int main(int argc,char* argv[])
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(1,1),&wsadata)!=0)
{
printf("WSAStartup failed.");
return 1;
}

SOCKET server_socket;
struct sockaddr_in servaddr;
struct sockaddr_in cliaddr;

//init servaddr
memset(&servaddr,0, sizeof(struct sockaddr_in));

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

server_socket = socket(PF_INET, SOCK_DGRAM, 0);
if(server_socket == -1)
{
printf("Create Server Socket Error.");
return 1;
}

// bind address and port to socket
if(bind(server_socket, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
return 1;
}

do_echo(server_socket, (struct sockaddr *)&cliaddr);

closesocket(server_socket);

return 0;
}



#include <winsock.h>
#include <stdio.h>

#define MAXLINE 80
#define SERV_PORT 7000


int main(int argc,char* argv[])
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(1,1),&wsadata)!=0)
{
printf("WSAStartup failed.\n");
return 1;
}

int len = sizeof(struct sockaddr_in);
SOCKET client_socket;

struct sockaddr_in servaddr;
struct sockaddr_in addr2;

unsigned long l2;

char pData[MAXLINE]="l|100000|loginsucessful|";

/* init servaddr */
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);

client_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (client_socket == -1)
{
printf("Socket Create Fail.\n");
return 1;
}

//printf("Socket:%d\n",client_socket);
memset(&addr2, 0, sizeof(addr2));
addr2.sin_family = AF_INET;
addr2.sin_port = htons(SERV_PORT);
addr2.sin_addr.s_addr = inet_addr("192.168.1.53");

sendto(client_socket, pData, sizeof(pData), 0, (struct sockaddr *)&addr2, sizeof(addr2));

int bytesReceived = recvfrom(client_socket, pData, MAXLINE, 0, (struct sockaddr *)&addr2, &len);
printf("%s\n",pData);

closesocket(client_socket);

return 0;
}




我在windows下面调试通过的.
linux下改下头文件
wjdlt_1997 2009-01-24
  • 打赏
  • 举报
回复
楼主真强,不懂Server语句的意思也能自己写个Client
waizqfor 2009-01-24
  • 打赏
  • 举报
回复
LZ还是先看看书
《Unix网络编程》和《Linux网络编程》对你很帮助
socket.h是windows下也支持的,你可以看一下msdn中关于这个类的说明,
然后再参考udp通讯的设计眶架。

int main(int argc, char **argv) //命令行的第二个参数代表服务器地址
{ int sockfd; //套接字
struct sockaddr_in servaddr; //服务器地址结构
/* 必须在命令行指定服务器地址*/
if (argc != 2) err_quit("usage: udpcli <IPaddress>");
bzero(&servaddr, sizeof(servaddr)); //地址结构清零
servaddr.sin_family = AF_INET; //IPv4
servaddr.sin_port = htons(SERV_PORT); //9877端口
/*网络字节序的IP地址*/
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
/*建立UPD套接口*/
sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
/*回射客户端子程序, stdin 为标准输入:键盘*/
dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));
exit(0); //子程序结束后退出程序
}
pauliuyou 2009-01-24
  • 打赏
  • 举报
回复
#define MAXLINE 80
#define SERV_PORT 6000 // 服务器端口

void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE]; // 数据区

for(;;) // 死循环,作服务器
{
len = clilen; // 长度
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len); // 这是核心方法,应该是一个阻塞的方法,一直在等待客户端的消息.
/* sent data back to client */
sendto(sockfd, mesg, n, 0, pcliaddr, len); // 这是发送到客户端的方法,好象数据从客户端读过来后,马上又给客户端回写回去
}
}

int main(void)
{
int sockfd; // SOCKET 编号
struct sockaddr_in servaddr, cliaddr; // SOCKET 地址结构体, 用来存放服务器和客户端的IP地址

sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */ // 实际创建一个SOCKET对象, AF_INET是IPV4的标志,SOCK_DGRAM是UDP数据包的标志

/* init servaddr */
bzero(&servaddr, sizeof(servaddr)); // 这个相当于memset, 先把服务器的IP地址信息全置成0
servaddr.sin_family = AF_INET; // 服务器IP的类型是IPV4
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 服务器绑定的IP是任意的.意思就是默认的IP地址
servaddr.sin_port = htons(SERV_PORT); // 服务器端口

// 开始绑定这个服务器,用创建好的SOCKET对象和服务器IP信息,以及服务器IP信息的长度.
/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
// 如果绑定失败,返回错误
perror("bind error");
exit(1);
}

// 进入主服务器的方法.也就是上面的死循环,程序一直在等待.
do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));

return 0;
}
xiaoyisnail 2009-01-24
  • 打赏
  • 举报
回复
建议看一下《Unix网络编程》
e_sharp 2009-01-24
  • 打赏
  • 举报
回复
UP
x360995630 2009-01-24
  • 打赏
  • 举报
回复
hahahaha

70,040

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧