Linux socket学习

 1 //服务器端 server.c
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<errno.h>
 6 #include<sys/types.h>
 7 #include<sys/socket.h>
 8 #include<netinet/in.h>
 9 #define MAXLINE 4096
10
11 //socket(int domain, int type, int protocol)
12 //         协议域      socket类型    指定协议
13 int main(int argc, char **argv)
14 {
15     int n, listenfd, connfd;
16     struct sockaddr_in servaddr;
17     char buff[MAXLINE];
18     if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
19     {
20         printf("create socket error:%s(error:%d)\n",strerror(errno),errno);
21         exit(0);
22     }
23     memset(&servaddr, 0, sizeof(servaddr));
24     servaddr.sin_family = AF_INET;
25     servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //系统绑定默认的网卡即IP地址
26     servaddr.sin_port = htons(6666); //监听本机的6666号端口
27
28     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
29     { //把一个地址族中的特定地址赋给socket
30         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
31         exit(0);
32     }
33     if( listen(listenfd, 10) == -1)
34     { //调用listen()监听socket
35         printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
36         exit(0);
37     }
38     printf("waiting for client‘s request...\n");
39     while(1)
40     {
41         if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
42         { //调用accept()函数取接收请求,连接建立好
43             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
44             continue;
45         }
46         n = recv(connfd, buff, MAXLINE, 0); //recv函数返回其实际copy的字节数
47         buff[n] = ‘\0‘;
48         printf("recv msg from client: %s\n", buff);
49         close(connfd);
50     }
51     close(listenfd);
52 }
 1 //客户端 client.c
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<errno.h>
 6 #include<sys/types.h>
 7 #include<sys/socket.h>
 8 #include<netinet/in.h>
 9 #define MAXLINE 4096
10
11 int main(int argc, char** argv)
12 {
13     int  n, sockfd;
14     char recvline[MAXLINE], sendline[MAXLINE];
15     struct sockaddr_in servaddr;
16     if( argc != 2)
17     {
18         printf("usage: ./client <ipaddress>\n");
19         exit(0);
20     }
21     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
22     {
23         printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
24         exit(0);
25     }
26     memset(&servaddr, 0, sizeof(servaddr));
27     servaddr.sin_family = AF_INET;
28     servaddr.sin_port = htons(6666);
29
30     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
31     { //IP地址转换函数
32         printf("inet_pton error for %s\n",argv[1]);
33         exit(0);
34     }
35     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
36     { //调用connect()发出连接请求
37         printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
38         exit(0);
39     }
40     printf("send msg to server: \n");
41     fgets(sendline, 4096, stdin);
42     if( send(sockfd, sendline, strlen(sendline), 0) < 0)
43     {
44         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
45         exit(0);
46     }
47     close(sockfd);
48     exit(0);
49 }

分别用gcc编译好后执行,开2个终端:

时间: 2024-09-30 20:50:42

Linux socket学习的相关文章

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

Linux程序设计学习笔记----进程间通信——管道

转载请注明出处: http://blog.csdn.net/suool/article/details/38444149, 谢谢! 进程通信概述 在Linux系统中,进程是一个独立的资源管理单元,但是独立而不孤立,他们需要之间的通信,因此便需要一个进程间数据传递.异步.同步的机制,这个机制显然需要由OS来完成管理和维护.如下: 1.同一主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO),消息队列(Message Queue)和共享内存(Share Memory).无名管道多用于亲

Linux 程序设计学习笔记----Linux下文件类型和属性管理

转载请注明出处:http://blog.csdn.net/suool/article/details/38318225 部分内容整理自网络,在此感谢各位大神. Linux文件类型和权限 数据表示 文件属性存储结构体Inode的成员变量i_mode存储着该文件的文件类型和权限信息.该变量为short int类型. 这个16位变量的各个位功能划分为: 第0-8位为权限位,为别对应拥有者(user),同组其他用户(group)和其他用户(other)的读R写W和执行X权限. 第9-11位是权限修饰位,

linux基础学习笔记——操作大全

作者:liaoyi 更新时间:2014-6-2 ****************基本操作***************** 关机 shutdown -h now    root用户               init 0              root用户halt      root+一般用户poweroff 重启shutdown -r now    root用户init6     root用户reboot            root+一般用户 注意:1.shutdown 比较灵活,可

Linux驱动学习步骤(转载)

1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出. 5. 写一完整驱动, 加上read, write, ioctl, polling等各种函数的驱动实现. 在ioctl里完成从用户空间向内核空间传递结构体的实现. 6. 写一bl

linux 核心学习书籍

1<LINUX程序设计> 基础是非常重要的 2<UNIX环境高级编程> 还是基础 ,假设你是搞UNIX/Linux环境下的应用程序编程,那么就看 3, <Linux内核设计与实现> 这本书解说浅显易懂.全书没有列举一条汇编语句.可是给出了整个Linux操作系统2.6内核的概观.使你能通过阅读迅速获得一个overview. 并且对内核中较为混乱的部分(例如以下半部),它的解说是最透彻的.对没怎么深入内核的人来说.这是强烈推荐的一本书. 翻译:翻译水平.负责任程度都不错.可

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

Android socket 学习记录 之 执行new socket(ip, port)程序崩溃

这段时间在学习Android的socket编程,我不是专做APP的,做的是bootloader.驱动.hal.framework这个线的,也就是系统搭建和功能优化设计.为了打通这整条线,为此学习了不少东西,今天把Android的socket学习记录一下,以防止以后会出现这样的低级错误. 我这里是在极客学院的源码基础上做的自己的一些添加和修改,学习开始不就是先会修改么,举一反三,自然就很快学会了.由于看过视频和资料后就迫不及待的按照自己的想法想做一个功能,但是遇到麻烦了,就是执行new socke