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;
}



0 0
原创粉丝点击