C语言网络编程:send函数详解
生活随笔
收集整理的這篇文章主要介紹了
C语言网络编程:send函数详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
函數(shù)描述
- #include <sys/socket.h>
- ssize_t send(int sockfd, const void *buf, size_t len, int flags);
- 函數(shù)功能:向對方發(fā)送數(shù)據
其實也可以使用sendto函數(shù):
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);,如果sendto后面的兩個參數(shù)為NULL和0時與send函數(shù)的作用是等價得。
sendto函數(shù)一般用作UDP通信 - 返回值:
成功:返回發(fā)送的字節(jié)數(shù)
失敗:返回-1 且errno被設置 - 函數(shù)參數(shù)
a. sockfd 用于通信的文件描述符
服務器:sockfd為accept返回的通信描述符
b. buf 應用緩存,用于存放要發(fā)送到數(shù)據
可以是任何類型:結構體,int , char,float,字符串
c. len buf的大小
d. flags 一般設置為0,此時send為阻塞式發(fā)送
即發(fā)送不成功會一直阻塞,直到被某個信號終端終止,或者直到發(fā)送成功為止。
指定MSG_NOSIGNAL,表示當連接被關閉時不會產生SIGPIPE信號
指定MSG_DONTWAIT 表示非阻塞發(fā)送
代碼實例
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/types.h> #include <errno.h>typedef struct data {char name[30];unsigned int num; }Data; void print_err(char *str, int line, int err_no) {printf("%d, %s :%s\n",line,str,strerror(err_no));_exit(-1); }int main() {int skfd = -1, ret = -1;skfd = socket(AF_INET, SOCK_STREAM, 0);if ( -1 == skfd) {print_err("socket failed",__LINE__,errno);}struct sockaddr_in addr;addr.sin_family = AF_INET; //設置tcp協(xié)議族addr.sin_port = 6789; //設置端口號addr.sin_addr.s_addr = inet_addr("192.168.102.169"); //設置ip地址ret = bind(skfd, (struct sockaddr*)&addr, sizeof(addr));if ( -1 == ret) {print_err("bind failed",__LINE__,errno);}/*將套接字文件描述符從主動轉為被動文件描述符,然后用于被動監(jiān)聽客戶端的連接*/ret = listen(skfd, 3);if ( -1 == ret ) {print_err("listen failed", __LINE__, errno);}/*被動監(jiān)聽客戶端發(fā)起的tcp連接請求,三次握手后連接建立成功*/int cfd = -1;struct sockaddr_in caddr = {0};//為應用層獲取客戶端的IP和端口號int csize = 0;cfd = accept(skfd, (struct sockaddr*)&caddr, &csize);if (-1 == cfd) {print_err("accept failed", __LINE__, errno);}printf("cport = %d, caddr = %s\n", ntohs(caddr.sin_port),inet_ntoa(caddr.sin_addr));//發(fā)送數(shù)據結構體定義Data std_data = {0};while (1) {printf("stu name:\n");scanf("%s",std_data.name);//對于int型的需要將主機端序轉換為網絡端序,這里轉成long型。printf("stu num:\n");scanf("%d",&std_data.num);std_data.num = htonl(std_data.num);//將數(shù)據std_data強制類型轉換后發(fā)送ret = send(cfd, (void *)&std_data,sizeof(std_data),0);if ( -1 == ret) {print_err("accept failed", __LINE__, errno);} }return 0; }總結
以上是生活随笔為你收集整理的C语言网络编程:send函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结对编程 王坤彬 20142112310
- 下一篇: A New Approach for E