基于socket的TCP和UDP通讯的简单建立
2017-08-12 17:16
375 查看
最近在学习Linux网络编程,写下此学习笔记。
一、建立简单TCP连接的步骤:
服务器端: 1.调用socket()函数定义套接字; 2.调用bind()函数绑定本地地址和端口; 3.调用listen()函数启动监听端; 4.调用accept()函数从已连接队列中提取客户链接,accept为阻塞类型函数,当连接队列为空时,阻塞等待; 5.调用IO函数与客户端通讯; 6.关闭套接字; 客户端: 1. 调用socket()函数创建套接字; 2. 调用connect()函数链接服务器端; 3. 调用IO函数(read/write等)与服务器端进行通讯; 4. 调用close()关闭套接字。
二、建立简单UDP连接的步骤:
服务器端: 1.调用socket()函数定义套接字 2.调用bind()函数绑定本地地址和端口; 3.调用recvfrom()和sendto()函数进行通信; 客户端 1.调用socket()函数创建套接字; 2.调用recvfrom()和sendto()函数进行通信;
/* * TCP--server */ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <linux/in.h> #include <stdlib.h> #include <string.h> int main(int argc,char*argv[]) // 执行时候输入端口号 { if(argc != 2) { printf("too few arg!\n"); exit(1); } /* 1.创建套接字 */ int sockfd = socket(AF_INET,SOCK_STREAM,0); printf("sockfd:%d\n",sockfd); /* 2.绑定地址 */ struct sockaddr_in srvaddr,cliaddr; socklen_t len = sizeof(srvaddr); bzero(&srvaddr,len); srvaddr.sin_family = AF_INET; srvaddr.sin_port = htons(atoi(argv[1])); srvaddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd,(struct sockaddr *)&srvaddr,len); /* 3.监听套接字 */ listen(sockfd,5); // “5”表示最大监听个数为5 char peer[16]; /* 4.等待客户端发起连接,连接成功就返回一个新的文件描述符 */ int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len); if(connfd > 0) { printf("new client connect:[%s]\n", (char *)inet_ntop(AF_INET,&cliaddr.sin_addr,peer,len) ); } char buf[100]; // 用于存放读取到的数据 while(1) { /* 每次读取前清空缓冲区 */ bzero(buf,100); /* 阻塞读取数据 */ //read(connfd,buf,sizeof(buf)); 可以直接调用IO函数 recv(connfd,buf,sizeof(buf),0); printf("from client:%s\n",buf); /* 如果客户端发出“quit”则退出 */ if(strncmp(buf,"quit",4) == 0) break; } /* 通讯完毕,关闭套接字 */ close(connfd); close(sockfd); return 0; }
/* * TCP---client */ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <linux/in.h> #include <stdlib.h> #include <string.h> int main(int argc, char const *argv[]) { if (argc != 3) { fprintf(stderr, " too few arg for %s\n", argv[0]); exit(1); } /* 1.创建套接字 */ int sockfd = socket (AF_INET, SOCK_STREAM, 0); printf("sockfd : %d\n", sockfd); /* 设置服务器ip与端口号 */ struct sockaddr_in seraddr; seraddr.sin_family = AF_INET; seraddr.sin_port = htons(atoi(argv[2])); inet_pton(AF_INET, argv[1], &seraddr.sin_addr); /* 发送连接请求 */ int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)); if (ret == -1) { fprintf(stderr, "connect error!\n" ); exit(1); } /* 发送消息 */ char buf[100]; //用于存储发送的数据 while(1) { bzero(buf, 100); fgets(buf, 100, stdin); send(sockfd, buf, strlen(buf),0); if (strncmp(buf, "quit", 4) == 0) break; } /* 通讯结束,关闭套接字 */ close(sockfd); return 0; }
/* * UDP -----server */ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <linux/in.h> #include <stdlib.h> #include <string.h> int main(int argc,char *argv[]) // 执行时需要指定端口号 { /* 1.创建套接字 */ int sockfd = socket(AF_INET,SOCK_DGRAM,0); /* 2.绑定服务器地址 */ struct sockaddr_in srvaddr; srvaddr.sin_family = AF_INET; srvaddr.sin_port = htons(atoi(argv[1])); srvaddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(srvaddr)); /* 3.调用IO函数进行通讯 */ char buf[100]; struct sockaddr_in cliaddr; socklen_t len = sizeof(cliaddr); while(1) { bzero(buf,100); bzero(&cliaddr,len); recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len); printf("from client:%s",buf); if(strncmp(buf,"quit",4) == 0) break; } /* 4.关闭套接字文件 */ close(sockfd); }
/* * UDP----client */ /* UDP客户端 */ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <linux/in.h> #include <stdlib.h> #include <string.h> int main(int argc,char *argv[]) // ./Jack 192.168.1.3 50001 { /* 1.创建套接字 */ int sockfd = socket(AF_INET,SOCK_DGRAM,0); /* 2.设置服务器的IP与端口号 */ struct sockaddr_in srvaddr; srvaddr.sin_family = AF_INET; srvaddr.sin_port = htons(atoi(argv[2])); inet_pton(AF_INET,argv[1],&srvaddr.sin_addr); /* 调用IO函数进行通讯 */ char buf[100]; while(1) { bzero(buf,100); fgets(buf,100,stdin); sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&srvaddr,sizeof(srvaddr)); if(strncmp(buf,"quit",4) == 0) break; } /* 4.关闭套接字 */ close(sockfd); return 0; }
相关文章推荐
- 基于Tcp&UDP协议的简单Socket通信实例(JAVA)
- java--通过socket和多线程进行多个客服端与服务器的简单通讯--基于tcp
- 基于Socket的UDP和TCP编程介绍
- 【转】基于Socket的UDP和TCP编程介绍
- 创建基于UDP协议的socket通讯
- 基于Socket的UDP和TCP编程介绍
- ios实现基于socket tcp/ip 的通讯
- 基于C#的Socket同步和异步通信(TCP/UDP)【入门推荐】
- linux C ----- udp, tcp, unix socket通信简单例子
- 【socket编程】 一个简单的基于TCP连接的客户端、服务端用例
- 基于Socket的UDP和TCP编程介绍
- 基于Socket的TCP和UDP编程
- 初识-----基于Socket的UDP和TCP编程及测试代码
- [转]基于C#的Socket简单通讯
- 基于TCP与UDP的简单聊天程序
- 客户端服务器基于Socket的UDP和TCP编程介绍
- ios实现基于socket tcp/ip的通讯
- c++ Linux下 socket tcp&udp编程简单范例
- Linux网络编程socket的简单应用(基于server和client 的tcp)
- 基于Socket的UDP和TCP编程介绍-转