Linux UDP编程(1)

下列测试是在两台机器上(服务端和客户端),编译运行

1. # gcc client.c -o client

client.c: 在函数‘main’中:

client.c:12: 错误:‘dest_addr’的存储大小未知

解决方案:

# gcc -E client.c | grep "struct sockaddr_in"

struct sockaddr_in dest_addr;

首先预处理编译client.c,发现无头文件,说明头文件指定错误

实际struct sockaddr_in声明包含在下列头文件中

#include <arpa/inet.h>

#include <netinet/in.h>

2. # gcc client.c -o client

#客户端

# ./client

write error: Connection refused

send number:9

服务器端

#tcpdump -i eth0 host 192.168.60.136 and udp

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

16:49:38.927885 IP localhost.56296 > abc123.ndmp: UDP, length 1024

16:49:38.927940 IP localhost.56296 > abc123.ndmp: UDP, length 1024

16:49:38.927958 IP localhost.56296 > abc123.ndmp: UDP, length 1024

16:49:38.927973 IP localhost.56296 > abc123.ndmp: UDP, length 1024

16:49:38.927988 IP localhost.56296 > abc123.ndmp: UDP, length 1024

16:49:38.928005 IP localhost.56296 > abc123.ndmp: UDP, length 1024

16:49:38.928021 IP localhost.56296 > abc123.ndmp: UDP, length 1024

16:49:38.928028 IP localhost.56296 > abc123.ndmp: UDP, length 1024

上述没有运行server端,直接运行client端,可见系统发送一部分数据包。服务器端接收数据包

3.服务器端

# netstat -su

IcmpMsg:

InType3: 55

OutType3: 467

Udp:

9617286 packets received

375854 packets to unknown port received.

108733 packet receive errors

6663 packets sent

RcvbufErrors: 108733

UdpLite:

IpExt:

InMcastPkts: 12125

OutMcastPkts: 209

InBcastPkts: 24214

OutBcastPkts: 18

InOctets: 15042525827

OutOctets: 108912059

InMcastOctets: 2415162

OutMcastOctets: 21128

InBcastOctets: 3161452

OutBcastOctets: 1404

#./server &

# netstat -su

IcmpMsg:

InType3: 55

OutType3: 467

Udp:

9624946 packets received

375854 packets to unknown port received.

111096 packet receive errors

6677 packets sent

RcvbufErrors: 111096

UdpLite:

IpExt:

InMcastPkts: 12139

OutMcastPkts: 209

InBcastPkts: 24261

OutBcastPkts: 18

InOctets: 15058618880

OutOctets: 109265743

InMcastOctets: 2417401

OutMcastOctets: 21128

InBcastOctets: 3165284

OutBcastOctets: 1404

###########################

192.168.60.136,7637

#./client

./client

send number:10000

上述系统发生丢包现象, 发送10000,实际接受了7637,从而由此可见udp不可靠的,需要进行流量控制。

上述大部分内容,参考了<<Unix 网络编程>>

================================================================client.c

//#include <arpa/inet.h>

//#include <netinet/in.h>

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

#include <stdio.h>

#include <strings.h>

int main()

{

char buf[1024];

int i=0;

struct sockaddr_in dest_addr;

int sockfd = socket(AF_INET,SOCK_DGRAM,0);

int len =  sizeof(buf);

bzero(&dest_addr,sizeof(dest_addr));

dest_addr.sin_family=AF_INET;

dest_addr.sin_port=htons(10000);

dest_addr.sin_addr.s_addr=inet_addr("192.168.60.123");

connect(sockfd,(struct sockaddr *)&dest_addr, sizeof(dest_addr));

while(i<10000)

{

i++;

int ret = sendto(sockfd, buf, len, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));

if (ret < 0)

{

perror("write error");

break;

}

}

printf("send number:%d\n",i);

}

=======================================================================server.c

#include <arpa/inet.h>

#include <netinet/in.h>

int main()

{

char buf[1024];

int i=0;

int fd = socket(AF_INET,SOCK_DGRAM,0);

struct sockaddr_in dest_addr;

bzero(&dest_addr,sizeof(dest_addr));

socklen_t addrlen;

dest_addr.sin_family=AF_INET;

dest_addr.sin_port=htons(10000);

dest_addr.sin_addr.s_addr=INADDR_ANY;

bind(fd,(struct sockaddr*)&dest_addr,sizeof(dest_addr));

while (1)

{

i++;

int ret = recvfrom(fd, buf, 1024, 0,(struct sockaddr*) &dest_addr, &addrlen);

if(ret < 0)

{

perror("recvfrom");

break;

}

printf ("%s,%d\n", inet_ntoa (dest_addr.sin_addr), i);

}

printf ("%s,%d\n", inet_ntoa (dest_addr.sin_addr), i);

}

时间: 2024-11-02 22:21:19

Linux UDP编程(1)的相关文章

linux网络编程-(socket套接字编程UDP传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

Linux网络编程10&mdash;&mdash;使用UDP实现五子棋对战

思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct tag_msg { int msg_type; /* 悔棋? */ int msg_color; int msg_row; int msg_col; }MSG, *pMSG; 2. 悔棋 用链表头插法来模拟栈,链表记录了双方下子的轨迹.结构如下: /* 记录每一步的轨迹 */ typedef stru

linux网络编程笔记——UDP

目前这部分代码会出现阻塞问题,暂时尚未解决 #include "udp.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <malloc.h> #include <sys/types.h> #include <sys/socket

嵌入式 Linux网络编程(三)——UDP编程模型

嵌入式 Linux网络编程(三)--UDP编程模型 UDP编程模型: UDP循环服务器模型为: socket(...); bind(...); while(1) {    recvfrom(...);    process(...);    sendto(...); } server.c代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #inc

Linux学习四:UDP编程(上)

关于UDP和TCP对比优缺,这里就不说了. 使用UDP代码所掉用的函数和用于TCP的函数非常类似,这主要因为套接口库在底层的TCP和UDP的函数上加了一层抽象,通过这层抽象使得编程更容易,但失去了一些控制. 二者函数调用唯一的实际区别是soceket函数调用的一个参数,TCP的是SOCK_STREAM,UDP的是SOCK_DGRAM,二者都可以使用recvfrom函数,而recv只用于TCP. 当然函数的变化不是这么简单,因为你要从一种有连接的协议转向到无连接的协议上去.这里写个很简单直接的UD

Linux 网络编程——UDP编程

概述 UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的运输层协议,在网络中用于处理数据包,是一种无连接的协议.UDP 不提供可靠性的传输,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地.由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快. UDP 有如下的特点: 1)邮件系统服务模式的抽象(可通过邮件模型来进行对比) 2)每个分组都携带完整的目的

基于Linux下的UDP编程

一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: Ø  建立套接字 Ø  将套接字地址结构进行绑定 Ø  读写数据 Ø  关闭套接字 2.客户端程序包括: Ø  建立套接字 Ø  读写数据 Ø  关闭套接字 3.服务器端和客户端程序之间的差别 服务器端和客户端两个流程之间的主要差别在于对地址的绑定函数(bind()函数),而客户端可以不用进行地址和端口的绑定操作. 二.Linux中UDP套接字函数  从图可知,UDP协议的服务端程序

Linux 下的 UDP 编程

2019-10-14 关键字:C 语言的 UDP 编程与实例 UDP 连接是一种无连接的网络连接协议. Linux 下的 UDP 编程的函数接口与 TCP 差不了多远.在 UDP 通信模型中,也是以 C/S 模型来通信的. 服务端的函数调用流程主要有以下几个: 1.socket() 2.bind() 3.recvfrom() / sendto() 4.close() 客户端的函数调用流程主要有以下几个: 1.socket() 2.sendto() / recvfrom() 3.close() s

Linux网络编程:基于UDP的程序开发回顾篇

基于无连接的UDP程序设计 同样,在开发基于UDP的应用程序时,其主要流程如下: 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多.对比面向连接的TCP程序,服务端少了listen和accept函数.前面我们也说过listen函数最主要的作用就是将一个socket套接字描述符转为被动监听模式,然后调用accept主要是用于等待客户端(用connect)来连接服务器.connect函数不仅可以用于流式套接字还可用于数据报式套接字.在TCP中,客户端调用connect函数