《socket编程由笑嘻嘻到绝望》(服务器和客户端)
来源:互联网 发布:软件可靠性方法 pdf 编辑:程序博客网 时间:2024/05/20 11:47
不管是无连接的或者是面相连接,两者服务端和客户端的模型是大致都是下面的几种模型。
面相连接服务端:
- socket()
- bind()
- listen()
- accept()
- write()/read()/send()/recv()
- close()
面相连接客户端:
- socket()
- connect()
- 读写操作如上
- close()
无连接服务器端
- socket()
- bind()
- sendto()/recvfrom()/write()/read()
- close()
无连接客户端
- socket()
- sendto()/recvfrom()/write()/read()
- close()
socket编程demo,这些都是简单的C/S模型,编程简单的模型在网上都可以找到就不一一赘述了。
第一个面相连接的tcp的服务器
这里的服务端的代码很简单,只是给连接的服务端一句话,按实际场景进行扩展就可以了。
这里一个小技巧,测试服务端写的成功与否,可以借助telnet验证,方式为telnet + ip + 端口
比如下面的服务端验证以后的打印如下
Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.i am baiyusend errConnection closed by foreign host.
#include <stdio.h> /*printf()*/#include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h> /* htons() */#include <strings.h> /*bzero() */#define MY_PORT 6666 //>1024 <65535#define MY_IP "127.0.0.1"#define MY_SEND "i am baiyu\n"int main(){ int socketfd = 0; int connfd = 0; struct sockaddr_in my_sock_addr; //这里没必要要用指针去堆空间申请内存 struct sockaddr_in client_sock_addr; socketfd = socket(AF_INET,SOCK_STREAM,0); if(-1 == socketfd){ printf("socketfd error!\n"); return -1; } my_sock_addr.sin_family = AF_INET; #if 0 //这种方式是固定ip的 my_sock_addr.sin_port = htons(MY_PORT); my_sock_addr.sin_addr.s_addr = inet_addr(MY_IP); #endif #if 1 my_sock_addr.sin_port = htons(MY_PORT); my_sock_addr.sin_addr.s_addr = htons(INADDR_ANY); #endif //这里注意清零的位置是这八位,千万不可以清错了 bzero(&(my_sock_addr.sin_zero), 8); if(-1 == bind(socketfd,(struct sockaddr*)&my_sock_addr,sizeof(struct sockaddr))){ printf("bind error!\n"); return -1; } if(-1 == listen(socketfd, 10) ){ printf("listen error!"); return -1; } while(1){ //这里length的类型要注意是socklen_t socklen_t length = sizeof(struct sockaddr_in); if( (connfd = accept(socketfd, (struct sockaddr*)&client_sock_addr, &length)) == -1){ printf("accept error!"); continue; } if (send(connfd, MY_SEND, 20, 0) == -1) { printf("send error!"); close(connfd); return -1; } close(connfd); } close(socketfd); return 0;}
第二个面相连接的tcp的客户端
在这里的客户端只是简单的接收了服务器的信息就退出,涉及详细功能再添加就可以了。
操作:首先打开服务端,然后运行客户端,打印出来自服务器的信息
./server./client 127.0.0.1打印信息:i am baiyu
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <netdb.h> #include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define PORT 6666 //>1024 <65535#define MAXDATASIZE 32int main(int argc, char *argv[]){ int sockfd = 0; int numsize = 0; char buf[MAXDATASIZE]; struct hostent *input_ip; struct sockaddr_in client_addr; if (argc != 2) { printf("usage: client error\n"); exit(1); } if ((input_ip=gethostbyname(argv[1])) == NULL) { printf("gethostbyname error\n"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("socket error\n"); exit(1); } client_addr.sin_family = AF_INET; client_addr.sin_port = htons(PORT); client_addr.sin_addr = *((struct in_addr *)input_ip->h_addr); bzero(&(client_addr.sin_zero), 8); if(connect(sockfd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1) { printf("connect error\n"); exit(1); } if((numsize=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { printf("recv error\n"); exit(1); } printf("%s\n",buf); fflush(stdout); close(sockfd); return 0;}
第三个无连接的udp的服务器
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h> #include <strings.h> #define SERVER_PORT 6666#define MAXDATASIZE 32int main(int ac, char *av[]){ int sock_server = 0; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int recvsize = 0; char recvbuf[256]; sock_server = socket(AF_INET, SOCK_DGRAM, 0); if(sock_server == -1){ printf("sock_server error!\n"); return -1; } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = htons(INADDR_ANY); socklen_t addrlen = sizeof(struct sockaddr); if(bind(sock_server, (struct sockaddr*)&server_addr, addrlen) == -1){ printf("bind error!\n"); return -1; } while(1){ if(recvsize = recvfrom(sock_server, recvbuf, 256, 0, (struct sockaddr*)&client_addr, &addrlen)>= 0){ printf("recvsize:%d\n%s\n",recvsize, recvbuf); break; } } close(sock_server); return 0;}
第四个无连接udp的客户端
#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define SERVER_PORT 6666#define SERVER_IP "127.0.0.1"#define MAXDATASIZE 256int main(int ac, char *av[]){ char recvbuf[256]; int recvsize = 0; struct sockaddr_in server_addr; char buf[MAXDATASIZE] = "I am baiyuer"; int client_sock = socket(AF_INET, SOCK_DGRAM, 0); if(client_sock == -1){ perror("socket"); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); socklen_t addrlen = sizeof(struct sockaddr); while(1){ if(sendto(client_sock, buf, strlen(buf) + 1, 0, (struct sockaddr*)&server_addr, addrlen) == -1){ continue; } } close(client_sock); return 0;}
阅读全文
1 0
- 《socket编程由笑嘻嘻到绝望》(服务器和客户端)
- 《socket编程由笑嘻嘻到绝望》(epoll简单高并发服务器模型)
- socket编程客户端和服务器
- 服务器和客户端的socket编程
- 实现UDP协议,socket编程,调用到windowsAPI,实现客户端和服务器
- java socket编程(服务器与客户端)
- socket编程(TCP多线程客户端服务器)
- socket 服务器和客户端
- Python网络编程之socket编程(一)--使用TCP和UDP客户端和服务器通信
- Linux socket编程 服务器 客户端
- socket编程服务器客户端例子
- 简单socket编程,服务器、客户端
- Socket编程服务器和客户端(多个客户端可以同时连接一个服务器的同一端口)
- Socket编程服务器和客户端(多个客户端可以同时连接一个服务器的同一端口)
- Socket编程服务器和客户端(多个客户端可以同时连接一个服务器的同一端口)
- Socket服务器和客户端程序(1)
- j2me Socket编程常用服务器和客户端编写结构
- Linux socket编程-最简单的服务器和客户端程序
- 最有用的idea快捷键整理(自定义)
- Hibernate 映射文件使用方式案例
- d3画图表
- 欢迎使用CSDN-markdown编辑器
- 不同的路径II
- 《socket编程由笑嘻嘻到绝望》(服务器和客户端)
- Windows Perl
- 运行java的class文件方法详解
- Linux内核驱动模块编程指南
- shell中正则表达式
- Spark Streaming结合Spark SQL开发案例:电商中不同类别中最热门的商品排名
- admob_注意事项_高级技巧
- 35年编程史沉淀下来的8条宝贵经验
- 程序员的朋友圈有毒