網絡IPC---TCP

最近工做日一直在忙工做,都是些YUV圖像格式處理的問題,由於還沒弄得很明白啊,因此無法往博客上面寫
昨天一天休息日又看了一天電影(罪惡啊),今天花了一中午看了點網絡IPC的問題,上來寫點。只當加深記憶,要是不慎被高手看到,請高手手下留情
之前一直在看APUE,但是我以爲他寫的網絡IPC這一章既不基礎,也不高深,乾脆換了本簡單的,隨便找了本,叫作《unix網絡編程實用技術與實例分析》,我不是要說這本書有多好(其實本人並不喜歡這本書的風格),只是交代一下本人的學習背景,以備未來有據可查
本人之前一直沒想清楚TCP/IP和我有什麼關係,今天看了一上午,終於知道點了,原來我調用的socket就是在TCP,UDP等協議的基礎上編寫而成的,我調用socket編程,它自己就幫我遵照了這些協議,呵呵,好東西
其它的就好懂了
其實我以爲socket編程入門很容易,無非就是背書嘛,(哈哈,吹牛啦)
把代碼拉進來,不知道你們可否看懂,我是差很少能夠背了,哈哈
服務器端程序
// File: tcpserver.c
#include <stdio.h>                    
#include <strings.h>                 /* for bzero() */
#include <unistd.h>                  /* for close() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <arpa/inet.h>

#define PORT 1234    //將會被打開的端口
#define BACKLOG 1     //最大鏈接數

int  main()
{
  int listenfd, connectfd; //socket描述符
  struct sockaddr_in server; //服務器地址信息
  struct sockaddr_in client; //客戶地址信息
  int sin_size;

//建立套接字
   if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    perror( "Creating socket failed.");
     exit(1);
  }

  //容許此地址重複綁定套接字
  int opt = SO_REUSEADDR;
  setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
//綁定
  bzero(&server,sizeof(server));     //能夠用memset函數代替的
  server.sin_family=AF_INET;
  server.sin_port=htons(PORT);
  server.sin_addr.s_addr = htonl (INADDR_ANY);//主機地址
   if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
  {
    perror( "Bind error.");
     exit(1);
  }        
//監聽
   if(listen(listenfd,BACKLOG) == -1)/* calls listen() */
  {    
    perror( "listen() error\n");
     exit(1);
  }
//接受---沒有接收到就給我阻塞
  sin_size=sizeof(struct sockaddr_in);
   if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1)  
  {
    perror( "accept() error\n");
     exit(1);
  }
//發送
  printf( "You got a connection from %s\n",inet_ntoa(client.sin_addr) ); 
  send(connectfd, "Welcome to my server.\n",22,0); /* send to the client welcome message */
//close
  close(connectfd); /*    close connectfd */
  close(listenfd);     /* close listenfd */                
}
客戶端程序:
// File: tcpclient.c
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <netdb.h>                // for struct hostent    

#define PORT 1234     //在別的遠程機上打開的端口
#define MAXDATASIZE 100     //數據的最大字節數

int main(int argc, char *argv[])
{
  int fd, numbytes;     //文件描述符
  char buf[MAXDATASIZE];    //存放接受數據的緩衝
  struct hostent *he;                
  struct sockaddr_in server;    //server的地址信息

   if (argc !=2)
  {            
    printf( "Usage: %s <IP Address>\n",argv[0]);
     exit(1);
  }
//根據名字獲取機器相關信息
   if ((he=gethostbyname(argv[1]))== NULL)
  {
    printf( "gethostbyname() error\n");
     exit(1);
  }
//socket
   if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1)
  {    
    printf( "socket() error\n");
     exit(1);
  }
//connect
  bzero(&server,sizeof(server));
  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);
  inet_aton(he->h_addr, &server.sin_addr);
   if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
  {
    printf( "connect() error\n");
     exit(1);
  }
//recv
   if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1)
  {
    printf( "recv() error\n");
     exit(1);
  }

  buf[numbytes]= '\0';
  printf( "Server Message: %s\n",buf);
//close
  close(fd);    
}
執行:
./tcpserver &
./tcpclient
結果:
You got a connection from 127.0.0.1
(這個固然是tcpserver打印的啦,只不過在後臺運行的程序忽然蹦到前臺罷了)
Server Message: Welcome to my server.
能夠用ps -ef來查看當前運行的進程,看看在後臺跑的程序是否還在跑
若是想殺死進程,則用 kill [pid] 就能夠了
相關文章
相關標籤/搜索