linux网络编程1 最简单的socket编程

下面是socket编程的服务器端

先看一个图,1

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<unistd.h>   //针对系统调用的封装    fork,pipe 各种i/o原语 read write 等
 5
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>    //互联网地址族   定义数据结构sockaddr_in
 8 #include<arpa/inet.h>   //提供IP地址转换函数
 9
10 #include<ctype.h>    //一批C语言字符分类函数 用    于 测试字符是否属于特定的字符类别  topper()在这里
11
12 #define MAXLINE 80
13 #define SER_PORT 8000
14
15 int main(void){
16
17     struct sockaddr_in servaddr,cliaddr;
18     socklen_t cliaddr_len;
19
20     int listenfd,connfd;
21     char buf[MAXLINE];
22     char str[INET_ADDRSTRLEN];
23     int i,n;
24     char tt[] = "exit1";   //这里有字符数组和字符指针的区别的坑 具体百度查询
25     char *bb;
26
27     listenfd = socket(AF_INET,SOCK_STREAM,0);  //
28                                                 //  domain 协议域    AF_INET AF_INET6,AF_LOCAL(AF_UNIX) AF_ROUTE
29                                                 //  type socket类型   SOCK_STREAM(流式socket 针对tcp )  SOCK_DGRAM(数据包  针对udp) SOCK_RAW
30                                                 // protocol  协议  tcp协议,udp协议  stcp协议 tipc协议
31
32     bzero(&servaddr,sizeof(servaddr));   //初始化赋值为0
33
34     servaddr.sin_family = AF_INET;
35     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);   //任何ip   //这里是大小端的 转换问题。。可以 百度
36     servaddr.sin_port = htons(SER_PORT);     //端口
37
38     bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));   //绑定链接的套接字描述符  和  地址和端口
39
40     listen(listenfd,20);
41
42     printf("Accepting connections ... \n ");
43     while(1){
44
45         cliaddr_len = sizeof(cliaddr);
46         connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);  //连接的套接字描述符    返回链接的地址   返回地址的缓冲区长度
47
48                                                                             //返回  客户端的套接字描述符
49         printf("connfd:%d------\n",connfd);
50
51         printf("received from %s at PORT %d \n",
52                 inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),
53                 ntohs(cliaddr.sin_port));
54         while(1){
55             n = read(connfd,buf,MAXLINE);    //  read(int fd,void *buf, size_t count);    成功返回  读取的字节数   数据保存在buf上   读取客户端的数据
56
57             printf("%d,")
58             //printf("buf:%s-----%d\n",buf,strcmp(buf,"exit1"));
59             //printf("tt:%s-----%d\n",tt,strcmp(tt,"exit1"));
60             for(int i=0;i<5;i++){
61                 tt[i] = buf[i];
62             }
63             printf("tt:%s-----%d\n",tt,strcmp(tt,"exit1"));
64             if(strcmp(tt,"exit1") == 0){      //strcmp  对比的就是字符
65                 close(connfd);
66                 printf("close:-----\n");
67                 break;
68             }
69
70             for(i=0; i < n; i++){
71                 buf[i] = toupper(buf[i]);
72             }
73             write(connfd,buf,n);   //   // 向客户端写入数据
74         }
75
76     }
77
78     return 0;
79
80 }
81
82 //这个程序有漏洞,如果客户端断线或者关闭,服务器就会死循环。   客户端的标准输入是阻塞的。。。其他都不是阻塞的。

客户端

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<unistd.h>
 5
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>
 8 #include<arpa/inet.h>
 9
10 #include<errno.h>  //错误
11
12 #define MAXLINE 80
13 #define SER_PORT 8000
14
15 int main(int argc,char *argv[]){
16
17
18     struct sockaddr_in servaddr;
19     char buf[MAXLINE];
20
21     int sockfd,n;
22     char *str;
23     char tt[5];
24
25     //if(argc != 2){
26        // fputs("usage: ./client message \n ",stderr);
27        // exit(1);
28     //}
29
30     //str = argv[1];
31
32     sockfd = socket(AF_INET,SOCK_STREAM,0);
33
34     bzero(&servaddr,sizeof(servaddr));
35     servaddr.sin_family = AF_INET;
36     inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);
37     servaddr.sin_port = htons(SER_PORT);
38
39     if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
40             printf("connet error:%s\n",strerror(errno));
41         }   //链接服务器
42
43     while(1){
44
45         memset(buf,0,MAXLINE);
46         printf("client connet server ...\n");
47         n = read(STDIN_FILENO,buf,MAXLINE);   //从标准输入  读取数据
48         for(int i=0;i<5;i++){
49                 tt[i] = buf[i];
50             }
51         if(strcmp(tt,"exit1") == 0){
52             printf("exit server connect \n");
53             close(sockfd);
54             return 0;
55         }
56
57         write(sockfd,buf,n);   //把我们的输入,写到服务器
58
59         if(strcmp(tt,"exit1") == 0){
60             printf("exit server connect \n");
61             close(sockfd);
62             return 0;
63         }
64
65         n = read(sockfd,buf,MAXLINE);    //从服务器读取数据
66
67
68         printf("Response from server:\n");
69         write(STDOUT_FILENO,buf,n);   //写到标注输出上
70         printf("\n");
71     }
72
73     close(sockfd);
74     return 0;
75
76 }

实验结果:

总结:一个socket建立一个连接,必须配合一个connect,对应的服务器端对应一个accept 。不能多次connet,多次是之后会报错,也不能同一个客户端socket多次accept,因为服务器已经有了,accept会阻塞等待其他客户端的socket。

时间: 2024-10-14 05:25:50

linux网络编程1 最简单的socket编程的相关文章

转 网络编程学习笔记一:Socket编程

网络编程学习笔记一:Socket编程 “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下:

网络编程学习笔记一:Socket编程

“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信? 2.So

C#版 Socket编程(最简单的Socket通信功能)

原文://http://blog.csdn.net/linybo/article/details/51141960 示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息:这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异步,以及它们的区别. 第一步:用指定的端口号和服务器的ip建立一个EndPoint对像: 第二步:建立一个Socket对像: 第三步:用socket对像的Bind()方法绑定EndPo

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

Linux下的基于Pthread的多线程Socket编程

程序设计 服务端的程序的设计主要是一个主线程首先调用Socket相关的函数socket,bind, listen在建立服务端的Socket之后,等待Accept上面,如果有新的客户端连接上来,则对于每一个客户端新建一个线程.在每一个客户端的线程中,其接收客户端发送的指令然后返回相关的信息,主线程Socket中默认的Accpet默认是阻塞的,这里采用了Linux中函数fctnl将其设置成非阻塞.除了客户端对应的线程和主线程之外,服务端还存在一个服务端的控制线程,其主要是接受服务端的命令,诸如退出,

【Python3】简单的socket编程demo

分为客户端,和服务端 # 服务端程序 import socket if __name__ == '__main__': # 1.创建socket(套接字)对象 serv = socket.socket() # 2.绑定地址信息 host = socket.gethostname() port = 12345 serv.bind((host, port)) # 3.开启监听 serv.listen(5) # 最大的等待序列数,可以等待5个,第6个就被拒绝了,一般默认是5 print("监听已开启,

初次试验最简单的socket编程

因为电脑限制同时为了操作方便,所以在本地的2个不同的工作空间的不同工程下测试: workspace-1: 服务器端代码 ServerSocketTest.java 1 package socket; 2 3 import java.io.BufferedReader; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.io.P

python socket编程之最简单的socket服务端

一.socket 编写server的步骤: 1.第一步是创建socket对象.调用socket构造函数.如: 1 socket = socket.socket( family, type ) family参数代表地址家族,可为AF_INET或AF_UNIX.AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信.       type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字).2.第二步是将socket绑定

Linux Socket编程-(转自吴秦(Tyler))

"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信?