⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 简单的socket编程例子.txt

📁 很简单的linux下的socket通讯实例
💻 TXT
字号:
服务器端程序:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>

#define      MYPORT 4000
#define BACKLOG 10

struct in_addr 
{
      unsigned long s_addr;
};

//扩展的套接字结构
struct sockaddr_in 
{
short         int           sin_family;           
unsigned      short int sin_port;        //internet port  
struct        in_addr       sin_addr;        //internet 地址      
unsigned      char          sin_zero[8];  

//sin_zero[8] 是为了是两个结构在内存中具有相同的尺寸把sin_zero 全部设成零值(使用bzero()或memset()函数)
};

//网络字节顺序
int main(int argc, char **argv)
{ 

int sockfd,new_fd      ; 
int sin_size;

struct sockaddr_in my_addr ;
struct sockaddr_in their_addr ;
    
/* 
  创建套接字连接符
      int socket(int domain , int type , int protocol)
      type:socket类型
*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
    printf("create sock\n");
    return -1;
}
else
{ 
      /*
      int bind (int sockfd , struct sockaddr *my_addr , int addrlen) ;
      struct sockaddr的指针,包含地址的信息
      */
      my_addr.sin_family          = AF_INET ; //主机字节顺序 
      my_addr.sin_port            = htons(MYPORT);       /* 网络字节顺序,短整型 */
      my_addr.sin_addr.s_addr = inet_addr("10.210.132.38") ;
      bzero(&(my_addr.sin_zero), 8); //其它结构部分置0
      /*
      bind()可以在程序中自动获取你自己的IP 地址和端口
      my_addr.sin_port = 0 ;                 
      my_addr.sin_addr.s_addr = INADDR_ANY 

//通过设置INADDR_ANY,bind()知道你要它将s_addr 填充为运行这个进程的机器的IP
  假如链接的时候你并不需要进行端口交互,使用connetc就可以,其自动寻找一个未使用的端口
      */

      if (bind (sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))==-1)
      {
       printf("bind error\n");
       return -1 ;
      }
        
      //等待别人连接,进行系统侦听请求,第二个参数是未经过处理的连接请求队列可以容纳的最大数目
      listen(sockfd, BACKLOG);
       
      while (1)
      {
       sin_size = sizeof(struct sockaddr_in);
       //第二个参数是远程客户端主机的信息
       //这时产生二个套接字,可以对远程套接字进行send和recv操作,sockfd仍然进行侦听
       new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);      //远端套接字
       if (new_fd == -1)
       { 
        printf("accept error\n");
       }

       char *msg = "Hello! World! ";
       int len, bytes_sent;
       len = strlen(msg);
       bytes_sent = send(new_fd, msg, len, 0); //向客户端发送信息

       printf("ok\n");
       close(new_fd);
      }
      close(sockfd);

}
       /*
   有个非常有趣的东西就是假如客户端不请求,服务器端的ok永远不会打印,这就是最普通的阻塞I/O模式: 服务器端在listen的时候,只是在那儿接受数据,它调用accept,但它并没有数据可以接受,accet函数阻塞在那儿.

       */
} 

客户端程序

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>

#define    MYPORT 4000
#define BACKLOG 10

struct in_addr 
{
      unsigned long s_addr;
};

struct sockaddr_in 
{
short       int         sin_family;           
unsigned    short int sin_port;        
struct      in_addr     sin_addr;         
unsigned    char        sin_zero[8];    
};

int main(int argc, char **argv)
{ 
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
    printf("socket error\n");
    return -1 ;
}

bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(MYPORT);
server_addr.sin_addr.s_addr= inet_addr("10.210.132.38") ;
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
    printf("connect error\n");
    return -1;
}
//返回的实际的数据长度
if((nbytes=read(sockfd,buffer,1024))==-1)
{
    printf("read error\n");
    return -1 ;
}

buffer[nbytes]='\0';
printf("I have received:%s\n",buffer);
close(sockfd);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -