|
有用的sokit- #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 4321
- #define BUF_SIZE 1024
- int main(int argc, char *argv[])
- {
- int sockfd, sendbytes, recvbytes;
- char buf[BUF_SIZE];
- struct hostent *host;
- struct sockaddr_in serv_addr;
- if(argc<2)
- {// 检查程序参数个
- printf("USAGE: ./tclient Hostname(or ip address)\n");
- exit(1);
- }
- //检查程序参数指定的服务器地止
- if((host = gethostbyname(argv[1])) == NULL)
- {
- perror("gethostbyname");
- exit(1);
- }
- if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {// 创建一个流
- socket perror("socket");
- exit(1);
- }
- //初始化serv_addr结构体变
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_port=htons(PORT);
- serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
- bzero(&(serv_addr.sin_zero), 8);
- // 连接服务
- if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1)
- {perror("connect");
- exit(1);
- }// 显示连接信
- printf("connect to server %s...\nInput the msg to send:\n", argv[1]);
- while (1)
- { // 循环发送、接收服务器信
- bzero(buf, sizeof(buf));// 清空缓
- if(fgets(buf, BUF_SIZE, stdin)) {
- // 终端输入一行数据
- if (strcmp(buf, "exit\n") == 0) break;// 判断是否退出循
- if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
- { // 是否发送成功
- perror("send");
- exit(1);
- }
- }
- bzero(buf, sizeof(buf));// 清空缓冲
- if((recvbytes = recv(sockfd, buf, BUF_SIZE, 0)) == -1)
- {
- // 等待接收数据
- perror("recv");
- exit(1);
- }
- else printf("receive from %d(socket): %s\n", sockfd, buf); // 打印接收数据 }
- close(sockfd);// 关闭
- socket return 0;
- }
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<string.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<netdb.h>
- #include<time.h>
- #include <string.h>
- #include <sys/ioctl.h>
- #include <arpa/inet.h>
- #define PORT 4321
- #define MAX_QUE_CONN_NM 5
- #define MAX_SOCK_FD FD_SETSIZE
- #define BUFFER_SIZE 1024
- #define HOSTLEN 256
- int main()
- {
- struct sockaddr_in server_sockaddr, client_sockaddr;
- int sin_size, count;
- fd_set inset, tmp_inset;
- int sockfd, client_fd, fd;
- char buf[BUFFER_SIZE];
- // 接收、发送缓
- struct sockaddr_in scinf[100];
- // 客户端地址池
- bzero((void *)scinf, sizeof(scinf));
- // 创建
- socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket");
- exit(1);
- }
- // 初始化服务器地址结构体
- server_sockaddr.sin_family=AF_INET;
- server_sockaddr.sin_port=htons(PORT);
- server_sockaddr.sin_addr.s_addr = INADDR_ANY;
- bzero(&(server_sockaddr.sin_zero), 8);
- // 为bind设置地址复用
- int i = 1;
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
- if(bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))==-1)
- {
- perror("bind");
- exit(1);
- }
- // 开始侦听客户端连
- if(listen(sockfd, MAX_QUE_CONN_NM) == -1)
- {
- perror("listen");
- exit(1);
- }
- printf("Begin listening...\n");
- // 准备非阻塞方式连接多路客户端
- FD_ZERO(&inset);
- FD_SET(sockfd, &inset);
- while (1)
- {
- tmp_inset = inset;
- sin_size = sizeof(struct sockaddr_in);
- memset(buf, 0, sizeof(buf));
- if(!(select(MAX_SOCK_FD, &tmp_inset, NULL, NULL, NULL) > 0))
- {//等待网络消息
- perror("select");
- exit(1);
- }
- for(fd = 0; fd < MAX_SOCK_FD; ++fd)
- {
- if (FD_ISSET(fd, &tmp_inset) > 0)
- {
- if (fd == sockfd)
- {// 有客户端连接请求,accept
- if((client_fd = accept(sockfd, (struct sockaddr*)&client_sockaddr, &sin_size))==-1)
- {
- perror("accept");
- exit(1);
- }
- FD_SET(client_fd, &inset);
- printf("New connection from %s\n", inet_ntoa(client_sockaddr.sin_addr));
- if(client_fd < 100 && client_fd >= 0)// 新连接客户端记入地址
- memcpy((void *)(&scinf[client_fd]), (void *)&client_sockaddr, sin_size);
- }
- ellse
- {
- // 有客户端数据
- if((count = recv(fd, buf, BUFFER_SIZE, 0)) > 0)
- {// 接收数
- if(fd >= 0 && fd < 100)
- printf("Received from %s:\t%s\n", inet_ntoa(scinf[fd].sin_addr), buf);
- if((count = send(fd, buf, strlen(buf), 0)) == -1)
- { // 回送数据
- perror("send");
- exit(1);
- }
- }
- else
- {// 无法读取数据,可能连接以断
- if(fd >= 0 && fd < 100)
- printf("Client %s has left\n", inet_ntoa(scinf[fd].sin_addr));
- memset((void *)(&scinf[client_fd]), 0, sin_size);
- close(fd);
- FD_CLR(fd, &inset);
- }
- }
- }
- }
- }
- close(sockfd); return 0;
- }
复制代码
|
|