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。麻烦写下详细代码,最好可运行

三个问题,谢谢了!!!
...全文
1196 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
c语言60个案例项目源码 c语言24点游戏源码 c语言Turbo C下写的俄罗斯方块 c语言五子棋源码 c语言俄罗斯方块 c语言别踩白块儿(双人版)源码 c语言华容道源码 c语言吃逗游戏源码 c语言地空对战游戏 c语言坑爹大冒险 c语言坦克游戏源代码 c语言大丰收游戏源码 c语言奔跑的火柴人游戏源码 c语言实现的象棋源码 c语言实现的超级玛丽游戏源码 c语言情人节的红玫瑰 c语言打字母游戏源码 c语言打字游戏代码 c语言扔香蕉的大猩猩 c语言拼图游戏源码 c语言支持自己创建迷宫,并求解最短路径 c语言涂格子游戏源码 c语言盒子接球游戏源码 c语言矿井逃生 c语言种地要浇水游戏源码 c语言自创军旗游戏源码 c语言自创推箱子游戏改版 c语言贪吃蛇游戏的双人对战版 c语言连连看游戏源码 c语言青蛙过河小游戏 c语言黑白棋ai游戏源码 纯c语言迷宫源码 c语言对对碰游戏源码 c语言配有图片和音乐的打字母游戏 c语言商品销售系统源码 c语言图书借阅系统源码 c语言图书管理系统源码 c语言学生信息系统 c语言学生成绩管理系统 c语言学生成绩管理系统源码 C语言超市管理系统 c语言通讯录管理系统源码 c语言UDP传输系统源码 c语言教工工资管理系统 c语言文本编辑器系统源码 c语言火车票订票管理源码 c语言万年历源码 c语言电子时钟程序 c语言做的一个任务管理器 c语言做的播放器源码 c语言做的绘图板系统 c语言对自己电脑系统测试 c语言力学相关的流体源码 c语言实现图片转化为 ASCII 图 c语言实现如果cmd中的ping c语言实现数字雨 c语言实现水波纹显示效果 c语言实现的汉诺塔演示程序 c语言实现类似弹力球效果 c语言实现非常漂亮祝福烟花效果
c语言24点游戏源码 c语言Turbo C下写的俄罗斯方块 c语言UDP传输系统源码 c语言奔跑的火柴人游戏源码 c语言别踩白块儿(双人版)源码 C语言超市管理系统 c语言吃逗游戏源码 c语言打字母游戏源码 c语言打字游戏代码 c语言大丰收游戏源码 c语言地空对战游戏 c语言电子时钟程序 c语言对对碰游戏源码 c语言对自己电脑系统测试 c语言俄罗斯方块 c语言盒子接球游戏源码 c语言黑白棋ai游戏源码 c语言华容道源码 c语言火车票订票管理源码 c语言教工工资管理系统 c语言坑爹;大冒险 c语言矿井逃生 c语言力学相关的流体源码 c语言连连看游戏源码 c语言模拟快打旋风游戏源码 c语言配有图片和音乐的打字母游戏 c语言实现类似弹力球效果 c语言实现如果cmd中的ping c语言实现数字雨 c语言实现水波纹显示效果 c语言实现图片转化为ASCI图 c语言贪吃蛇游戏的双人对战版 c语言坦克游戏源代码 c语言通讯录管理系统源码 c语言图书管理系统源码 c语言图书借阅系统源码 c语言涂格子游戏源码 c语言万年历源码 c语言文本编辑器系统源码 c语言五子棋源码 c语言学生成绩管理系统 c语言学生成绩管理系统源码 c语言学生信息系统 c语言支持自2已创建迷宫,并求解最短路径 c语言种地要浇水游戏源码 c语言自创军旗游戏源码 c语言自创推箱子游戏改版 c语言做的播放器源码 c语言做的绘图板系统 c语言做的一个任务管理器 纯c语言迷宫源码 链表HuffmanTree

69,368

社区成员

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

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