Socket TCP

套接字socket有三种类型
流式    (SOCK_STREAM )使用 TCP
数据报  (SOCK_DGRAM ) 使用 UDP
原始     对低层协议如IP或ICMP直接访问

 4个函数,1个结构

socket,bind,listen,accept

struct sockaddr_in
struct in_addr
{ {
short  int  sin_family; /* Internet 地址族 */ unsigned long s_addr;   /*32位地址*/
unsigned  short  int sin_port; /*  端 口号 号 */ }
struct  in_addr  sin_addr; /* IP 地址 */
unsigned  char  sin_zero[8]; /*  填0 */
}

 在网络上标识一台机器可以用IP,也可以使用主机名 。

struct hostent *gethostbyname(const char *hostname) 

struct  hostent { 
       char    *h_name;                 /* official name of host */ 
       char    **h_aliases;             /* alias list */ 
       int       h_addrtype;             /* host address type */ 
       int       h_length;                 /* length of address */ 
       char    **h_addr_list;         /* list of addresses from name server */ 
/* #if defined  __USE_MISC || defined __USE_GNU */ 
#ifndef _POSIX_C_SOURCE 
       #define h_addr  h_addr_list[0]  /* address, for backward compatiblity */ 
       #endif                                        /* !_POSIX_C_SOURCE */ 
      };

 

地址转换
int inet_aton(const char *cp,struct in_addr *inp)  /*a.b.c.d形式转换为32位IP   储存在inp里*/
char *inet_ntoa(struct in_addr in)         /*32位IP转换为a.b.c.d形式   */

server_addr.sin_addr.s_addr=inet_addr("192.168.1.1");

inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。 

 字节序转换    32bit的整数(0x01234567)从地址0x100开始 

小端          数据低位存放在高位地址

 

大端          数据低位存放在低位地址

 

 网络字节采用大端

 htons    unsigned short 主机——>网络

 htonl     unsigned long   主机——>网络

 ntohs    unsigned shor   网络——>主机

 ntohl     unsigned long   网络——>主机

#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
#include < string.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <netinet/ in.h> 
#include <sys/socket.h> 

#define portnumber 3333

int main( int argc,  char *argv[]) 

     int sockfd,new_fd; 
     struct sockaddr_in server_addr; 
     struct sockaddr_in client_addr; 
     int sin_size; 
     int nbytes;
     char buffer[ 1024];
    

     /*  服务器端开始建立sockfd描述符  */ 
     if((sockfd= socket(AF_INET,SOCK_STREAM, 0))==- 1//  AF_INET:IPV4;SOCK_STREAM:TCP
    { 
        fprintf(stderr, " Socket error:%s\n\a ",strerror(errno)); 
        exit( 1); 
    } 

     /*  服务器端填充 sockaddr结构  */ 
    bzero(&server_addr, sizeof( struct sockaddr_in));  //  初始化,置0
     server_addr.sin_family=AF_INET;                  //  Internet
     server_addr.sin_addr.s_addr= htonl(INADDR_ANY);   //  (将本机器上的long数据转化为网络上的long数据)服务器程序能运行在任何ip的主机上   // INADDR_ANY 表                                                     示主机可以是任意IP地址,即服务器程序可以绑定到所有的IP上
   
// server_addr.sin_addr.s_addr= inet_addr ("192.168.1.1");   // 用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
     server_addr.sin_port= htons(portnumber);          //  (将本机器上的short数据转化为网络上的short数据)端口号
    
     /*  捆绑sockfd描述符到IP地址  */ 
     if( bind (sockfd,( struct sockaddr *)(&server_addr), sizeof( struct sockaddr))==- 1
    { 
        fprintf(stderr, " Bind error:%s\n\a ",strerror(errno)); 
        exit( 1); 
    } 

     /*  设置允许连接的最大客户端数  */ 
     if( listen (sockfd, 5)==- 1
    { 
        fprintf(stderr, " Listen error:%s\n\a ",strerror(errno)); 
        exit( 1); 
    } 

     while( 1
    { 
         /*  服务器阻塞,直到客户程序建立连接  */ 
        sin_size= sizeof( struct sockaddr_in); 
         if((new_fd= accept (sockfd,( struct sockaddr *)(&client_addr),&sin_size))==- 1
        { 
            fprintf(stderr, " Accept error:%s\n\a ",strerror(errno)); 
            exit( 1); 
        } 

        fprintf(stderr, " Server get connection from %s\n ",inet_ntoa(client_addr.sin_addr));  //  将网络地址转换成.字符串
         if((nbytes=read(new_fd,buffer, 1024))==- 1
        { 
            fprintf(stderr, " Read Error:%s\n ",strerror(errno)); 
            exit( 1); 
        }         
        buffer[nbytes]= ' \0 ';
        printf( " Server received %s\n ",buffer);
         /*  这个通讯已经结束  */ 
        close(new_fd); 
         /*  循环下一个  */ 
    } 

     /*  结束通讯  */ 
     close(sockfd); 
    exit( 0); 

 

 

#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
#include < string.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <netinet/ in.h> 
#include <sys/socket.h> 

#define portnumber 3333

int main( int argc,  char *argv[]) 

     int sockfd; 
     char buffer[ 1024]; 
     struct sockaddr_in server_addr; 
     struct hostent *host; 

     if(argc!= 2
    { 
        fprintf(stderr, " Usage:%s hostname \a\n ",argv[ 0]); 
        exit( 1); 
    } 

     /*  使用hostname查询host 名字  */
     if(( host= gethostbyname(argv[ 1]))==NULL) 
    { 
        fprintf(stderr, " Gethostname error\n "); 
        exit( 1); 
    } 

     /*  客户程序开始建立 sockfd描述符  */ 
     if((sockfd= socket(AF_INET,SOCK_STREAM, 0))==- 1//  AF_INET:Internet;SOCK_STREAM:TCP
    { 
        fprintf(stderr, " Socket Error:%s\a\n ",strerror(errno)); 
        exit( 1); 
    } 

     /*  客户程序填充服务端的资料  */ 
    bzero(&server_addr, sizeof(server_addr));  //  初始化,置0
     server_addr.sin_family=AF_INET;           //  IPV4
     server_addr.sin_port=htons(portnumber);   //  (将本机器上的short数据转化为网络上的short数据)端口号
     server_addr .sin_addr = *(( struct  in_addr *)host->h_addr);  //  IP地址
    
     /*  客户程序发起连接请求  */ 
     if( connect (sockfd,( struct sockaddr *)(&server_addr), sizeof( struct sockaddr))==- 1
    { 
        fprintf(stderr, " Connect Error:%s\a\n ",strerror(errno)); 
        exit( 1); 
    } 

     /*  连接成功了  */ 
    printf( " Please input char:\n ");
    
     /*  发送数据  */
    fgets(buffer, 1024,stdin); 
    write(sockfd,buffer,strlen(buffer)); 
     /*  结束通讯  */ 
     close(sockfd); 
    exit( 0);   

 

 

转载于:https://www.cnblogs.com/liuchengchuxiao/p/4312663.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值