|
有用的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)
- {// 檢查程序參數(shù)個(gè)
- printf("USAGE: ./tclient Hostname(or ip address)\n");
- exit(1);
- }
- //檢查程序參數(shù)指定的服務(wù)器地止
- if((host = gethostbyname(argv[1])) == NULL)
- {
- perror("gethostbyname");
- exit(1);
- }
- if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {// 創(chuàng)建一個(gè)流
- socket perror("socket");
- exit(1);
- }
- //初始化serv_addr結(jié)構(gòu)體變
- 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);
- // 連接服務(wù)
- 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)
- { // 循環(huán)發(fā)送、接收服務(wù)器信
- bzero(buf, sizeof(buf));// 清空緩
- if(fgets(buf, BUF_SIZE, stdin)) {
- // 終端輸入一行數(shù)據(jù)
- if (strcmp(buf, "exit\n") == 0) break;// 判斷是否退出循
- if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
- { // 是否發(fā)送成功
- perror("send");
- exit(1);
- }
- }
- bzero(buf, sizeof(buf));// 清空緩沖
- if((recvbytes = recv(sockfd, buf, BUF_SIZE, 0)) == -1)
- {
- // 等待接收數(shù)據(jù)
- perror("recv");
- exit(1);
- }
- else printf("receive from %d(socket): %s\n", sockfd, buf); // 打印接收數(shù)據(jù) }
- close(sockfd);// 關(guān)閉
- 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];
- // 接收、發(fā)送緩
- struct sockaddr_in scinf[100];
- // 客戶端地址池
- bzero((void *)scinf, sizeof(scinf));
- // 創(chuàng)建
- socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket");
- exit(1);
- }
- // 初始化服務(wù)器地址結(jié)構(gòu)體
- 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設(shè)置地址復(fù)用
- 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");
- // 準(zhǔ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))
- {//等待網(wǎng)絡(luò)消息
- perror("select");
- exit(1);
- }
- for(fd = 0; fd < MAX_SOCK_FD; ++fd)
- {
- if (FD_ISSET(fd, &tmp_inset) > 0)
- {
- if (fd == sockfd)
- {// 有客戶端連接請(qǐng)求,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
- {
- // 有客戶端數(shù)據(jù)
- if((count = recv(fd, buf, BUFFER_SIZE, 0)) > 0)
- {// 接收數(shù)
- 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)
- { // 回送數(shù)據(jù)
- perror("send");
- exit(1);
- }
- }
- else
- {// 無法讀取數(shù)據(jù),可能連接以斷
- 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;
- }
復(fù)制代碼
|
-
-
sokit.zip
2019-6-30 22:25 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
3.9 MB, 下載次數(shù): 4, 下載積分: 黑幣 -5
|