Unix网络编程之读写操作recv和send函数
来源:互联网 发布:华为换手机数据迁移 编辑:程序博客网 时间:2024/05/11 00:46
函数原型
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
参数说明:
sockfd—表示一个打开的套接口描述字
buff—表示一个指向发送或者接受缓冲区的指针
nbytes—表示要发送的字节数
flags—参数通常为0
返回值说明:
如果函数调用成功,则返回读入或写出的字节数;
如果函数调用失败,则返回-1
flags参数说明:
flags参数可以为下列一个或多个常值的逻辑或,但是在一般的情况下,直接指定为0就可以了。
MSG_DONTROUTE:本标志告知宿主机内核在某个直接连接的本地网络上,因而无需执行路由表查找。
MSG_DONTWAIT:本标志在无需打开相应套接口的非阻塞标志前提下,把单个I/O操作临时指定为非阻塞,接着执行I/O操作,然后关闭非阻塞标志。
MSG_OOB:对于send,本标志指明即将发送带外数据;对于recv,本标志指明即将读入的是带外数据而不是普通数据。
MSG_PEEK:本标志适用于recv或recvfrom,指明允许我们窥看已可读取的数据,不过系统不丢弃由recv或recvfrom窥看过的数据。
MSG_WAITALL:本标志告知内核不要在尚未读入请求数据的字节之前让一个读操作返回
实例代码:
//server.c
#include <unistd.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
int main( int argc , char **argv )
{
int sockfd;
int connfd;
struct sockaddr_in servaddr;
struct sockaddr_in clitaddr;
int size;
char recvbuf[1024];
sockfd = socket(AF_INET , SOCK_STREAM , 0 );
memset( &servaddr , 0 , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(30000);
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen( sockfd , 1024 );
if((connfd = accept(sockfd, (struct sockaddr *)&clitaddr, &size)) >= 0)
{
memset(recvbuf, '\0', 1024);
recv(connfd, recvbuf, 1024, 0);
printf("recv string is %s\n", recvbuf);
send(connfd, "hello, I am server", 1024, 0);
}
close(connfd);
close(sockfd);
return 0;
}
//client.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
int main( int argc , char ** argv )
{
int sockfd;
char recvbuf[1024];
struct sockaddr_in servaddr;
if((sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ){
printf( "socket error\n" );
exit( 1 );
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(30000);
if(inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr ) <= 0) {
printf( "inet_pton error for %s\n" , argv[ 1 ] );
exit( 1 );
}
if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
printf( "connect error\n" );
exit( 1 );
}
memset(recvbuf, '\0', 1024);
send(sockfd, "hello, I am client", 1024, 0);
recv(sockfd, recvbuf, 1024, 0);
printf("recv string is %s\n", recvbuf);
close(sockfd);
return 0;
}
- Unix网络编程之读写操作recv和send函数
- UNIX网络编程——send与recv函数详解
- UNIX网络编程——send与recv函数详解
- 网络编程send和recv
- 网络编程学习笔记(recv和send函数)
- 网络编程send、recv函数详解
- 网络编程之recv send研究
- linux网络编程--深入浅出send和recv
- linux网络编程--深入浅出send和recv
- UNIX网络编程-send、recv、sendto、recvfrom详解
- socket之recv和send函数
- send和recv函数
- Send和Recv函数
- send和recv函数
- send和recv函数
- recv()和send()函数
- unix 下send和recv函数详解 (转载)
- 网络send/recv函数解析
- UVA - 10815 Andy's First Dictionary
- Android群英传学习-第三章:控件架构与自定义控件详解
- poj3069(贪心)
- 线性代数讲什么?
- (1)Android学习------介绍
- Unix网络编程之读写操作recv和send函数
- 循环结构及数组
- bzoj3572: [Hnoi2014]世界树
- angular2 post以“application/x-www-form-urlencoded”形式传参的解决办法
- HDU 1754 I Hate It
- 《深入理解计算机系统》第一章计算机系统漫游笔记
- 崩溃信息
- A*,Dijkstra,BFS算法性能比较及A*算法的应用
- 替换字符串中的空格为其他字符