数据报 Sockets
我不想讲更多了,所以我给出代码 talker.c 和 listener.c。
listener 在机器上等待在端口 4590 来的数据包。talker 发送数据包到一定的 机器,他包含用户在命令行输入的东西。
这里就是 listener.c:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define MYPORT 4950 /* the port users will be sending to */
#define MAXBUFLEN 100
main()
{
int sockfd;
struct sockaddr_in my_addr; /* my address information */
struct sockaddr_in their_addr; /* connector's address information */
int addr_len, numbytes;
char buf[MAXBUFLEN];
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(MYPORT); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
== -1) {
perror("bind");
exit(1);
}
addr_len = sizeof(struct sockaddr);
if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, \
(struct sockaddr *)&their_addr, &addr_len)) == -1) {
perror("recvfrom");
exit(1);
}
printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
printf("packet is %d bytes long\n",numbytes);
buf[numbytes] = '\0';
printf("packet contains \"%s\"\n",buf);
close(sockfd);
}
注意在我们的调用 socket(),我们最后使用了 SOCK_DGRAM。同时,没有 必要去使用 listen() 或者 accept()。我们在使用无连接的数据报套接口!
下面是 talker.c:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define MYPORT 4950 /* the port users will be sending to */
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in their_addr; /* connector's address information */
struct hostent *he;
int numbytes;
if (argc != 3) {
fprintf(stderr,"usage: talker hostname message\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */
herror("gethostbyname");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; /* host byte order */
their_addr.sin_port = htons(MYPORT); /* short, network byte order */
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */
if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, \
(struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) {
perror("sendto");
exit(1);
}
printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));
close(sockfd);
return 0;
}
这就是所有的了。在一台机器上运行 listener,然后在另外一台机器上运行 talker。观察他们的通讯!
Except for one more tiny detail that I've mentioned many times in the past: connected datagram sockets. I need to talk about this here, since we're in the datagram section of the document. Let's say that talker calls connect() and specifies the listener's address. From that point on, talker may only sent to and receive from the address specified by connect(). For this reason, you don't have to use sendto() and recvfrom(); you can simply use send() and recv().

Linux/Unix网络编程指南(Socket 编程)—(12)
作者:转载自:更新时间:2009-8-2
- SQLite数据库最适合做网站内容管理
- 详解有关线程组的操作示例
- 详解atoi () 函数
- 关于C与C++头文件一览
- 关于C/C++数组名与指针区别详解
- Symbian的异步框架
- 比较IronPython和C#的执行速度
- 我的Visual C++入门之路2
- 我的Visual C++入门之路1
- PHP编写的掷骰器脚本
- PHP编写的乐透机游戏脚本
- PHP编写的米德里比斯游戏脚本全过程
- PH编写的扑克牌器脚本
- PHP编写的随机名称生成器脚本
- PHP编写的场景生成器脚本
- C++ STL 算法另类使用方法
- c++教程之开发中数据结构和算法的分
- C++中禁止异常信息传递到析构函数外
- C++教程之利用非托管并列缓存
- 非对称密码算法制作共享软件的注册
- C++教程之遗传算法详解
- C++中的常规抽象详解
- C/C++程序中内存的的分配详解
- C++教程之快速计算32位数中1的位数
- Java中得抽象数据类型
- 提高编程效率的几点小技巧
- Java面向对象编程实例详解
- Java复杂数据类型用法
- C语言源代码——贪吃蛇游戏
- Visual C++源代码——俄罗斯方块程
- VC编程全过程—“幸运52”猜价格游
- VB.NET和Java得OOP设计
- Delphi编程实现3D图形修饰技术
- 一道JAVA题
- 理解端口,系统服务,系统进程概念
- C语言编程较容易易犯的错误总结
- Boost 库中的实用工具类使用入门(
- Linux/Unix网络编程指南(Socket 编
- Linux/Unix网络编程指南(Socket 编
- Linux/Unix网络编程指南(Socket 编
- Linux/Unix网络编程指南(Socket 编
- 如何编写PHP程序增加一个系统用户
- VB下如何编写CRC校验程序
- Linux/Unix网络编程指南(Socket 编
- ASP与JSP的比较
- Linux/Unix网络编程指南(Socket 编
- 算法合集
- 什么叫做状态机?
- 排序算法实现大全
- C语言常用宏定义技巧
- C语言常用排序全解
- linux内核基本数据类型总结
- 程序员数据结构笔记
- C语言难点分析整理
- C语言高效编程秘籍
- VB与VC混合编程中处理消息的方法
- boost::asio::error的用法浅析
- Boost 库中的实用工具类使用入门(
- Boost 库中的实用工具类使用入门(
- 线程同步-信号量-strand的用法总结
- Access二级视频教程
- 平面设计视频教程
- 编程开发视频教程
- 三维动画视频教程
- 网页设计视频教程
- Flash动画视频教程
- 办公软件视频教程
- 网店技巧视频教程
- 硬件技术视频教程
- 等级考试视频教程