歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> Linux下C語音實現socket發送和接收的小程序,linuxsocket

Linux下C語音實現socket發送和接收的小程序,linuxsocket

日期:2017/3/3 17:21:25   编辑:學習Linux

Linux下C語音實現socket發送和接收的小程序,linuxsocket


熱度2 評論 80 www.BkJia.Com 網友分享於: 2017-02-28 04:02:19 浏覽數215次

Linux下C語音實現socket發送和接收的小程序,linuxsocket


1、什麼是socket套接字

 

socket分為三種類型:

字節流套接字(Stream Socket),最常用socket類型,TCP協議使用此類接口。提供面向連接(建立虛擬電路)、無差錯、發送順序一致、無記錄邊界和非重復的網絡信包傳輸

數據報套接字(Datagram Socket),UDP協議使用此類接口,提供無連接服務,它以獨立的信包進行網絡傳輸,信包最大長度為32KB,傳輸不保證順序性、可靠性和無重復性,它通常用於單個報文傳輸或可靠性不重復的場合。數據報套接字接口的一個重要特點是它保留了記錄邊界。

原始數據報套接字(Raw Socket),提供對網絡下層通訊協議(eg:IP協議)的直接訪問,一般不是提供給普通用戶的,主要用於開發新的協議或者用於提取協議教隱蔽的功能

2、 客戶服務器通信流程

  • 創建套接字

  #include <sys/types.h> /* See NOTES */

  #include <sys/socket.h>

  int socket(int domain, int type, int protocol);//返回sockfd

  函數定義:這個函數返回套接字描述符,它唯一標識一個socket,後續操作用它作為參數來進行一些讀寫操作,socket函數的三個參數分別為:

  返回值:創建新描述符正確返回0,錯誤返回-1,並有對應的errorno詳情見 https://linux.die.net/man/2/socket

  • 綁定IP和port

  #include <sys/types.h>

  #include <sys/socket.h>

  int bind(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

  返回值:創建新描述符正確返回0,錯誤返回-1,詳情見 https://linux.die.net/man/2/bind

  • 監聽連接

  #include <sys/types.h>

  #include <sys/socket.h>

  int listen(int sockfd, int backlog);

  返回值:創建新描述符正確返回0,錯誤返回-1,詳情見 https://linux.die.net/man/2/listen

  • 接收連接

  #include <sys/types.h>

  #include <sys/socket.h>

  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

  返回值:成功則返回一個非負的SOCKET類型的值,表示接收到的套接字描述符,錯誤返回-1,並有對應的errorno,詳情見https://linux.die.net/man/2/accept

3、C 程序

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdint.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <error.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
int main(){
    struct sockaddr_in server_addr, client_addr;
    int socketserver;
    int err;
    int socketclient;as
    struct timeval timeout;
    char rcvbuf[100];
    char sedbuf[100000];
    timeout.tv_sec=5;
    timeout.tv_usec=0;
    //socket buff size
    int opt=100000;

    if((socketserver = socket(AF_INET,SOCK_STREAM,0)) == -1)
        return 1;
    //接受時限5s
    //setsockopt(socketserver, SOL_SOCKET,SO_RCVTIMEO, (char*)&timeout,sizeof(timeout));
    //發送時限5s
    //setsockopt(socketserver, SOL_SOCKET,SO_SNDTIMEO, (char*)&timeout,sizeof(timeout));
    //接收緩沖區
    setsockopt(socketserver, SOL_SOCKET, SO_RCVBUF, (const char*)&opt,sizeof(opt));
    //發送緩沖區
    setsockopt(socketserver, SOL_SOCKET, SO_SNDBUF, (const char*)&opt,sizeof(opt));
    //設置服務器地址信息設置
    server_addr.sin_family = AF_INET;                    //TCP
    server_addr.sin_port = htons(8080);                  //網絡字節順序采用大端模式
    server_addr.sin_addr.s_addr = INADDR_ANY;            //本地IP地址
    // server_addr.sin_addr.s_addr=htonl(127.0.0.1);
    printf("server port:%ld\n", ntohs(server_addr.sin_port));
    memset(server_addr.sin_zero,'\0',sizeof(server_addr.sin_zero));
    err=bind(socketserver, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
    if(err == -1){
        perror("bind error:");
        return 1;
     }
    if((err = listen(socketserver,10)) == -1){
        perror("listen error:");
        return 1;
     }
    while(1){
        int len = sizeof(struct sockaddr);
        head:
        if((socketclient = accept(socketserver,(struct sockaddr *)&client_addr,&len)) == -1){
           if(errno == 11){
            puts("timeout");
              goto head;
             }
            else{
            perror("accpet error:");
            return 1;
            }
        }
      write(socketclient,sedbuf,100000);
      printf("send sucess\n");
      // handle the connection of client
      while(1){
         memset(rcvbuf,'\0',100);
         len = read(socketclient,rcvbuf,40);
         if(len <=0){
               if(errno == EINTR || errno == EAGAIN)// except interruption XXX 92                
            continue; 
             else{
                 perror("client down:");
                 break;
              }
         }
           printf(" I received  %s\n",rcvbuf);
      }//while(1) handle the connection of client
  }//while(1) 
return 0;
}
View Code

http://www.bkjia.com/Linuxjc/1196046.htmlwww.bkjia.comtruehttp://www.bkjia.com/Linuxjc/1196046.html

Copyright © Linux教程網 All Rights Reserved