TCP服務器,實現client發送消息,server接收消息

server.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<pthread.h>

static void usage(const char *proc)
{
 printf("Usage: %s [ip] [port]\n",proc);
}

void *thread_run(void *arg)
{
 printf("create a new thread\n");
 int fd=(int)arg;
 char buf[1024];
 while(1){
  memset(buf,'\0',sizeof(buf));
  ssize_t _s=read(fd,buf,sizeof(buf)-1);
  if(_s>0){
   buf[_s]='\0';
   printf("client# %s\n",buf);
   write(fd,buf,strlen(buf));
  }else if(_s==0){
   printf("client close...\n");
   break;
  }else{
   printf("read error...\n");
   break;
  }
 }
 return(void *)0;
}

int main(int argc,char *argv[])
{
 if(argc!=3){
  usage(argv[0]);
  exit(1);
 }

 //1. creat sock
 int listen_sock=socket(AF_INET,SOCK_STREAM,0); //IPV4, 流式套接字
 if(listen_sock<0){
  perror("socket");
  return 1;
 }

 struct sockaddr_in local;
 local.sin_family=AF_INET;
 local.sin_port=htons(atoi(argv[2])); //端口號
 local.sin_addr.s_addr=inet_addr(argv[1]); //IP地址

 //2. bind 綁定本地信息,接口強轉成通用接口
 if(bind(listen_sock,(struct sockaddr*)&local,sizeof(local))<0){ 
  perror("bind");
  return 2;
 }

 //3. listen
 listen(listen_sock,5);  //監聽狀態

 //4. accept
 struct sockaddr_in peer;
 socklen_t len=sizeof(peer);
 while(1){
 int fd=accept(listen_sock,(struct sockaddr*)&peer,&len);
 if(fd<0){
  perror("accept");
  return 3;
 }
 printf("get a new link,socket -> %s:&d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));

 pthread_t id;
 pthread_create(&id,NULL,thread_run,(void*)fd);

 pthread_detach(id);
 }
 return 0;
}

client.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<pthread.h>

static void usage(const char *proc)
{
 printf("Usage: %s [ip] [port]\n",proc);
}

int main(int argc,char *argv[])
{
 if(argc!=3){
  usage(argv[0]);
  exit(1);
 }
 int sock=socket(AF_INET,SOCK_STREAM,0);
 if(sock<0){
  perror("socket");
  return 2;
 }

 struct sockaddr_in remote;
 remote.sin_family=AF_INET;
 remote.sin_port=htons(atoi(argv[2])); //argv[2]
 remote.sin_addr.s_addr=inet_addr(argv[1]);//argv[1]

 if(connect(sock,(struct sockaddr*)&remote,sizeof(remote))<0){
  perror("connect");
  return 3;
 }

 char buf[1024];
 while(1){
  memset(buf,'\0',sizeof(buf));
  printf("please Enter: ");
  fflush(stdout);
  ssize_t _s=read(0,buf,sizeof(buf)-1);
  if(_s>0){
   buf[_s-1]='\0';
   write(sock,buf,strlen(buf));
   _s=read(sock,buf,sizeof(buf));
   if(_s>0){
    buf[_s]='\0';
    printf("%s\n",buf);
   }
  }
 }
 return 0;
}


Makefile文件:

.PHONY:all
all:client server
client:client.c
 gcc -o $@ $^ -lpthread
server:server.c
 gcc -o $@ $^ -lpthread
.PHONY:clean
clean:
 rm -f client server

wKiom1ecHdPStrloAABpNH-mLZY194.png

telnet是遠程終端協議

在終端使用者的電腦上使用telnet程序,用它連接到服務器。終端使用者可以在telnet程序中輸入命令,這些命令會在服務器上運行,就像直接在服務器的控制檯上輸入一樣。可以在本地就能控制服務器。要開始一個telnet會話,必須輸入用戶名和密碼來登錄服務器。Telnet是常用的遠程控制Web服務器的方法。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章