歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> socket通信――TCP

socket通信――TCP

日期:2017/3/3 11:07:05   编辑:Linux技術
1、socket
每一條TCP連接兩個端點,TCP連接的端點交錯socket socket=(IP地址:端口號)―――>標示了網絡上唯一的一個進程 每一條TCP連接被兩個socket(即socket pair)唯一的確定。 TCP連接={socket1,socket2}={{IP1,port1},{IP2,port2}}2、網絡字節序 1)大端:大端放在該值的起始地址;一個數據的高字節放在起始地址2)小端:小端放在該值的起始地址;一個數據的低字節放在起始地址3)數組:數組元素是按照元素個數開辟完空間,將第一個元素放在低地址,而第一個元素如果是大端,就將其高字節放在元素的起始地址處

4)網絡字節序 網絡字節序是大端的,讀的時候認為讀到的第一個字節是高字節;所以小端要轉換成大端

發數據:從低地址――>高地址 ;收數據:從低地址――>高地址 主機字節序――網絡字節序 網絡字節序――主機字節序3、socket地址的數據類型

各種socket地址結構體的開頭都是相同的,前16位表示整個結構體的長度(並不是所有UNIX的實現 都有長度字段,如Linux就沒有),後16位表示地址類型。
4、TCP 幾個需要注意的點: 1)socket中的數據格式是:SOCK_STREAM 2) bind之前需要將容器struct sockaddr_in 進行初始化: 端口號:將主機序列轉成網絡序列; IP地址:字符串轉成整形 3)int listen(sockfd,backlog) 需要了解backlog是什麼意思 listen狀態下可以監聽多個client,所以可以backlog個client處於連接等待狀態,超過 backlog個的就忽略
4)accept()用於被動等待連接,其中有兩個參數需要注意 int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen) addr:是一個傳出參數,該函數返回時,將client的端口號和IP地址填充進去如果 addr=NULL,表示不關心addr的地址 addrlen:是一個傳入傳出參數,進去的時候是定義的addr結構體的大小,傳出的是實 際client的addr 的大小(有可能實際的小於定義的) 5)client端不需要bind函數去綁定,也不建議bind,但是常規上是可以bind的 6)connect連接的時候填充的是server的地址代碼1:單server――單client
1)server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
const short _PORT=8080;
#define _IP "127.0.0.1" 
int main()
{
  //1.create socket
  int listenfd=socket(AF_INET,SOCK_STREAM,0);
  if(listenfd<0)
  {
    perror("socket");
    return 1;
  }
  //2.1initial sockaddr_in
  struct sockaddr_in local;
  local.sin_family=AF_INET;
  local.sin_port=htons(_PORT);
  local.sin_addr.s_addr=inet_addr(_IP);
  if(bind(listenfd,(struct sockaddr*)&local,sizeof(local))<0)
  {
    perror("bind");
    return 2;
  }
  int ret=listen(listenfd,5);
  if(ret<0)
  {
    perror("listen");
    return 3;
  }
  while(1)
  {
    struct sockaddr_in peer;
    socklen_t len=sizeof(peer);
    int fd=accept(listenfd,(struct sockaddr *)&peer,&len);
    if(fd<0)
    {
      perror("accept");
      return 4;
    }
    else{
        char buf[1024];
        while(1)
        {
          memset(buf,'\0',1024);
          ssize_t _s=read(fd,buf,sizeof(buf)-1);
          if(_s>0)
          {
		//printf("client# %s",buf);
            buf[_s]='\0';
            write(fd,buf,sizeof(buf)-1);
 	      printf("client# %s",buf);
           // write(fd,buf,sizeof(buf)-1);
          }
          else if(_s==0)
          {
            printf("read done ...\n");
            break;
          }
          else{
            break;
          }
        }
        close(fd);
        break;
    }
    
  }
  return 0;
}
2)client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
const short _PORT=8080;
const char *_IP="127.0.0.1";
int main()
{
  //1creat socket
  int fd=socket(AF_INET,SOCK_STREAM,0);
  if(fd<0)
  {
    perror("socket");
    return 1;
  }
  struct sockaddr_in remote;
  remote.sin_family=AF_INET;
  remote.sin_port=htons(_PORT);
  remote.sin_addr.s_addr=inet_addr(_IP);
  int ret=connect(fd,(struct sockaddr *)&remote,sizeof(remote));
  if(ret<0)
  {
    perror("connect");
    return 2;
  }
  char buf[1024];
  while(1)
  {
    memset(buf,'\0',sizeof(buf));
    printf("Please Enter:\n");
    ssize_t _s=read(0,buf,sizeof(buf)-1);
    if(_s>0)
    {
      buf[_s]='\0';
      write(fd,buf,strlen(buf));
      memset(buf,'\0',sizeof(buf));
      ssize_t _ss=read(fd,buf,sizeof(buf)-1);
      if(_ss>0)
      {
        buf[_ss]='\0';
        printf("%s",buf);
      }
      else
      {
        break;
      }
    }
  }
  return 0;
}

本文出自 “momo就是辣麼萌” 博客,請務必保留此出處http://momo462.blog.51cto.com/10138434/1831198
Copyright © Linux教程網 All Rights Reserved