Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*クライアント
- コンパイル時はこんな感じで gcc -O2 -o tcp_newclient tcp_newclient.c
- サーバー側も同様
- */
- #include "inet.h" /* サーバと同じ inet.h を共用 */
- #define BUFSIZE 1024
- char name[64];
- int gotrcv(int fd){
- fd_set fdset;
- struct timeval timeout;
- FD_ZERO(&fdset);
- FD_SET(fd, &fdset);
- timeout.tv_sec = 0;
- timeout.tv_usec = 0;
- return select(fd+1 , &fdset , NULL , NULL , &timeout );
- }
- void client(int fd) /* クライアントの仕事の中心 */
- {
- char b[BUFSIZE];
- char c[BUFSIZE];
- int n;
- while(1){
- memset(b, 0, sizeof(b));
- memset(c, 0, sizeof(c));
- if(gotrcv(0)){
- read(0, b, BUFSIZ);
- n = strlen(b);
- b[n - 1] = '\0';
- if ( write(fd, b, n) <= 0 ) /* ヌル文字も含めてサーバに通信 */
- return;
- }
- if(gotrcv(fd)){
- if ( (n = read(fd, c, BUFSIZE)) <= 0 )
- return;
- printf("%s\n", c);
- }
- }
- }
- void client2(int fd) /* クライアントの仕事の中心 */
- {
- char b[BUFSIZE];
- char c[BUFSIZE];
- int n;
- fd_set readfds;
- while(1){
- memset(b, 0, sizeof(b));
- memset(c, 0, sizeof(c));
- /* readfdsを初期化 */
- FD_ZERO(&readfds);
- /* 標準入力をreadfdsにセットする*/
- FD_SET(0, &readfds);
- /* ソケットをreadfdsにセットする */
- FD_SET(fd, &readfds);
- if(FD_ISSET(0, &readfds)){
- read(0, b, BUFSIZ);
- n = strlen(b);
- b[n - 1] = '\0';
- if ( write(fd, b, n) <= 0 ) /* ヌル文字も含めてサーバに通信 */
- return;
- }
- if(FD_ISSET(fd, &readfds)){
- if ( (n = read(fd, c, BUFSIZE)) <= 0 )
- return;
- printf("%s\n", c);
- }
- }
- }
- int input_name(int fd) {
- name[0] = '\0'; /* 初期化 */
- printf("名前を入力してください: ");
- if (fgets(name, sizeof(name), stdin) == NULL) {
- fprintf(stderr, "Input your name!\n");
- close(fd);
- return -1;
- }
- name[strlen(name)-1] = '\0'; /* 改行文字を消す */
- printf("Your name is '%s'\n", name);
- write(fd, name, strlen(name)); /* 送信 */
- return 0;
- }
- void error(char *s) /* エラー処理 (サーバと同じ) */
- {
- perror(s);
- exit(1);
- }
- int main(int argc, char **argv)
- {
- int sockfd;
- struct sockaddr_in sin;
- if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0 ) /* socket */
- error("cannot create socket");
- bzero((char *)&sin, sizeof(sin)); /* sin に 0 をつめる */
- sin.sin_family = PF_INET; /* Internet ドメイン */
- sin.sin_addr.s_addr = inet_addr(SERVER_ADDR); /* アドレスはサーバ */
- sin.sin_port = htons(SERVER_PORT); /* ポートは SERVER_PORT */
- if ( connect(sockfd, (struct sockaddr *)&sin, sizeof(sin)) < 0 )
- error("cannot connect");
- if(input_name(sockfd) < 0)
- error("cannot input");
- client(sockfd); /* クライアントの仕事の中心 */
- if ( shutdown(sockfd, SHUT_RDWR) < 0 ) /* これ以上の送受信を禁止 */
- error("cannot shutdown");
- close(sockfd);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement