Linux_C socket 数据报之client, server.c

dgrecv.c

 1 /****************************************************************
 2  * dgrecv.c - datagram receiver
 3  *              usage: dgrecv portnum
 4  *             action: listens at the specfied port and reports messages
 5  */
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 #include <sys/types.h>
 9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <netdb.h>
12 #include <string.h>
13 #include <arpa/inet.h>
14 #include <unistd.h>
15
16 #define oops(m,x) {perror(m); exit(x);}
17
18 int make_dgram_server_socket(int);
19 int get_internet_address(char* , int , int *, struct sockaddr_in *);
20 void say_who_called(struct sockaddr_in* );
21
22 int main(int argc, char* argv[]) {
23   int port;
24   int sock;
25   char buf[BUFSIZ];
26   size_t msglen;
27   struct sockaddr_in saddr;
28   socklen_t saddrlen;
29
30   if(argc==1 || (port=atoi(argv[1]))<=0){
31     fprintf(stderr, "usage :dgrecv portnumber\n");
32     exit(1);
33   }
34
35   /*get a socket and assign it a port number*/
36   if((sock=make_dgram_server_socket(port))==-1)
37     oops("cannot make server", 2);
38
39   /*receive messages on that socket*/
40   saddrlen=sizeof(saddr);
41   while((msglen=recvfrom(sock ,buf, BUFSIZ, 0, &saddr, &saddrlen))>0) {
42     buf[msglen]=‘\0‘;
43     printf("dgrecv: got a message: %s\n", buf);
44     say_who_called(&saddr);
45   }
46   return 0;
47 }
48
49 //return the sock_id
50 int make_dgram_server_socket(int port){
51   struct sockaddr_in saddr;
52   struct hostent *hp;
53   char hostname[BUFSIZ];
54   int sock;
55
56   sock=socket(PF_INET, SOCK_DGRAM, 0);
57   if(sock==-1)
58     return -1;
59   gethostname(hostname, BUFSIZ);
60   hp=gethostbyname(hostname);
61   bzero((void*)&saddr, sizeof(saddr));
62   bcopy(hp->h_addr, (struct sockaddr*)&saddr.sin_addr, hp->h_length);
63   saddr.sin_family=AF_INET;
64   saddr.sin_port=htons(port);
65   if(bind(sock, (struct sockaddr*)&saddr, sizeof(saddr))!=0)
66     return -1;
67   return sock;
68 }
69
70 int get_internet_address(char* host, int len, int *portp, struct sockaddr_in* addrp) {
71   /*
72    * extracts host and port from an internet socket address
73    * *addrp->(host, port)
74    */
75   strncpy(host, inet_ntoa(addrp->sin_addr), len);
76   *portp=ntohs(addrp->sin_port);
77   return 0;
78 }
79
80 void say_who_called(struct sockaddr_in *addrp) {
81   char host[BUFSIZ];
82   int port;
83
84   get_internet_address(host, BUFSIZ, &port, addrp);
85   printf("from: %s: %d\n", host, port);
86 }

dgsend.c

 1 /***********************************************************************
 2  * dgsend.c - datagram sender
 3  *            usage: dgsend hostname portnumber "message"
 4  *            action: sends message to hostname : portnumber
 5  */
 6
 7 #include <stdio.h>
 8 #include <stdlib.h>
 9 #include <sys/types.h>
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <netdb.h>
13
14 #define oops(m, x) {perror(m); exit(x);}
15
16 int main(int argc, char* argv[]) {
17   char *message;
18   int cli_sock;
19   struct sockaddr_in saddr;
20   struct hostent *hp;
21
22   if(argc!=4){
23     printf("please cin hostname portnumber and message ./n");
24     exit(-1);
25   }
26   cli_sock=socket(AF_INET, SOCK_DGRAM, 0);
27   if(cli_sock==-1)
28     oops("cannot make socket", 2);
29
30   message=argv[3];
31
32   /*make internet address*/
33   bzero((void*)&saddr, sizeof(saddr));
34   hp=gethostbyname(argv[1]);
35   bcopy(hp->h_addr, (struct sockaddr*)&saddr.sin_addr, hp->h_length);
36   saddr.sin_family=AF_INET;
37   saddr.sin_port=htons(atoi(argv[2]));
38
39   if(sendto(cli_sock, message, strlen(message), 0, &saddr, sizeof(saddr))==-1)
40     oops("sendto failed", 3);
41   return 0;
42 }

其中,注意

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h>
uint32_t
uint16_t
uint32_t
uint16_t
htonl(uint32_t
htons(uint16_t
ntohl(uint32_t
ntohs(uint16_t
hostlong);
hostshort);
netlong);
netshort);
这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。例
如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。如果
主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些
函数不做转换,将参数原封不动地返回。

时间: 2024-10-27 06:12:22

Linux_C socket 数据报之client, server.c的相关文章

Linux_C socket 数据报之一些辅助函数

1 /******************************************************************** 2 * dgram.c 3 * support functions for datagram based programs 4 */ 5 #include <stdio.h> 6 #include <unistd.h> 7 #include <sys/types.h> 8 #include <sys/socket.h>

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

Linux_C socket server.c clinet.c功能分开写

socklib.h1 int make_server_socket(int ); 2 int connect_to_server(char* , int ); 3 int process_request(int ); 4 int talk_with_server(int ); socklib.c 1 /* socklib.c 2 * This file contains functions used lots when writing internet 3 * client/ server pr

Netty:一种非易失堵塞client/server相框

Netty:一种非易失堵塞client/server相框 作者:chszs.转载需注明.博客主页:http://blog.csdn.net/chszs Netty是一个异步事件驱动的网络应用框架,为Java网络应用的开发带来了一些新活力.Netty由协议server和client所组成.可用于高速开发可维护的高性能软件.Netty应用框架及其工具简化了网络编程,并且由Netty社区进行维护. Netty还被归类为NIOclient/server框架.用它能够高速.简易地开发网络应用.使得TCP和

NetMQ(ZeroMQ)Client =&gt; Server =&gt; Client 模式的实现

ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库.它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(message broker).该库设计成常见的套接字风格的API. ZeroMQ是由iMatix公司和大量贡献者组成的社群共同开发的.ZeroQ通过许多第三方软件支持大部分流行的编程语言 .类库提供一些套接字(对传统Berkeley套接字和Unix domain socket的泛化),每一个套接字可

《Python Network Programming Cookbook》读书笔记1---套接字, IPv4, 简单的Client/Server程序

这一部分主要介绍python中socket模块的相关内容,socket即套接字. socket是使用TCP/IP协议的应用程序通常采用的应用编程接口,它位于运输层和应用层之间,起源于UNIX,由于遵从UNIX“一切皆文件的”思想故socket可看作一种特殊的文件,对其的操作基本可以视为读写I/O.打开.关闭.关于套接字的基本概念@吴秦的Linux Socket编程(不限Linux)写的很详细,大家可以参考. 在下面列出的各个部分中我将先贴出代码,然后对其进行解释. 通过python3获得本机名和

Network client/server (二)

接上篇 Network client/server (一) server.c 1  header files #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> heade

Linux SocketCan client server demo hacking

/*********************************************************************** * Linux SocketCan client server demo hacking * 说明: * 本文主要是解读Linux上的SocketCan的基本使用方法,内容和Linux上的 * 网络编程差不多. * * 2016-3-28 深圳 南山平山村 曾剑锋 ********************************************

Java Client/Server 基础知识

Java的网络类库支持多种Internet协议,包括Telnet, FTP 和HTTP (WWW),与此相对应的Java网络类库的子类库为:  Java.net  Java.net.ftp  Java.net.www.content  Java.net.www.html  Java.net.www.http  这些子类库各自容纳了可用于处理Internet协议的类和方法.其中,java.net用于处理一些基本的网络功能,包括远程登录(Telnet):java.net.ftp用于处理ftp协议:j