sendmsg and receive seems atomic

本文作者  速谷歌  

   http://www.sugoogle.com


server.c


#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include "sys/wait.h"
#include "sys/select.h"
#include "sys/poll.h"


#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <spawn.h>


#define MAXSIZE 131070
#define SUGOOGLE_PORT  6177


int main(int argc, char ** argv) {
        int sockfd;
        struct sockaddr_in serv_socket;
        struct sockaddr_in  * client_socket = (struct sockaddr_in *) malloc (sizeof(struct sockaddr_in));
        char buf[MAXSIZE + 1]; 


        sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
        bzero(&serv_socket, sizeof(serv_socket));
        serv_socket.sin_family = AF_INET;
        serv_socket.sin_addr.s_addr = htonl(INADDR_ANY);
        serv_socket.sin_port = htons(SUGOOGLE_PORT);
        bind(sockfd, (struct sockaddr *)&serv_socket, sizeof(serv_socket));


        while (1) {
        struct msghdr msg;
        msg.msg_name = client_socket;
     
        msg.msg_namelen = sizeof(struct sockaddr_in);
        struct iovec io; 
        io.iov_base = buf;
        io.iov_len = MAXSIZE;
        msg.msg_iov = &io;
        msg.msg_iovlen = 1;


        ssize_t len = recvmsg(sockfd, &msg, 0); 
        client_socket = (struct sockaddr_in *)msg.msg_name;
        char ip[16];
        inet_ntop(AF_INET, &(client_socket->sin_addr), ip, sizeof(ip));
        int port = ntohs(client_socket->sin_port);
        char * temp = msg.msg_iov[0].iov_base;
        temp[len] = '\0';
        printf("get message from %s[%d]: %s\n", ip, port, temp);
        }
        close(sockfd);
}
              

client.c


#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <spawn.h>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/select.h"
#include <pthread.h>
#include <malloc.h>


#define MAXSIZE 100


#define SUGOOGLE_PORT  6177
int max_array = 0;


void* p_send(void* s) {
        int sockfd;
        struct sockaddr_in serv_socket;
        int maxfdpl;
        int *num = s;
        char *send  = malloc(max_array);


        if (*num == 1) {
            memset (send, 'M', max_array);
        } else {


            memset (send, 'O', max_array);


        }








        sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
        bzero(&serv_socket, sizeof(serv_socket));
        serv_socket.sin_family = AF_INET;
        serv_socket.sin_port = htons(SUGOOGLE_PORT);
        inet_pton(AF_INET, "127.0.0.1", &serv_socket.sin_addr);


        struct msghdr msg;
        memset(&msg, 0 ,sizeof(msg));
        msg.msg_name = &serv_socket;
        msg.msg_namelen = sizeof(struct sockaddr_in);
        struct iovec io;
        memset(&io, 0 , sizeof(io));
        io.iov_base = send;
        io.iov_len = max_array;
        msg.msg_iov = &io;
        msg.msg_iovlen = 1;


        ssize_t send_size = sendmsg(sockfd, &msg, 0);
        if (send_size) {
            perror("AAAAA");
        }


        close(sockfd);
        //exit(0);


}


main (int argc, char **argv){


    pthread_t p;
    int s = 2; // secondary
    int id = 1;


    max_array =  atoi(argv[1]);


    printf("current langth is %d\n", max_array);
    pthread_create(&p, NULL, p_send, (void *) &s);
    p_send((void*)&id);


}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值