1. 程式人生 > >Socket UDP【簡單聊天例項】

Socket UDP【簡單聊天例項】

server和client寫在一起,雙向通訊。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>
using namespace std;

#define MAXDATASIZE 1024
#define IP "127.0.0.1"
int send_head_port;
int send_tail_port;
int recv_tail_port;


pthread_t rec_head_thread, rec_tail_thread, send_tail_thread;

char my_ip[16];
char server_head_ip[16];
char server_tail_ip[16];

void init_client();
void *send_head_server(void *args);
void *recv_tail_server(void *args);

void *send_head_server(void *args)
{
    int sockfd;
    struct sockaddr_in sin_addr;
    bzero(&sin_addr, sizeof(sin_addr));
    sin_addr.sin_family = AF_INET;
    sin_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    sin_addr.sin_port = htons(send_tail_port);
    int sin_len = sizeof(sin_addr);
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        printf("Error opening socket\n");
        exit(1);
    }
    while (1)
    {
        char msg[MAXDATASIZE];
        scanf("%s", &msg);
        sendto(sockfd, msg, MAXDATASIZE, 0, (struct sockaddr *)&sin_addr, sin_len);
    }
}

void *recv_tail_server(void *args)
{
    printf("rrrr\n");
    int sockfd;
    char buft[MAXDATASIZE];
    struct sockaddr_in cli_addr;
    bzero(&cli_addr, sizeof(cli_addr));
    cli_addr.sin_family = AF_INET;
    cli_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    cli_addr.sin_port = htons(recv_tail_port);
    socklen_t cli_len = sizeof(cli_addr);

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        printf("error opening socket\n");
        exit(1);
    }
    if (bind(sockfd, (struct sockaddr *)&cli_addr, sizeof(cli_addr)) == -1)
    {
        printf("error in bind\n");
        exit(1);
    }

    while (1)
    {
        if (recvfrom(sockfd, buft, MAXDATASIZE, 0, (struct sockaddr *)&cli_addr, &cli_len) > 0)
                printf("RECV: %s\n", buft );
    }
}
void init_client()
{

}
int main(int argc, char *argv[])//recv_tail_port, send_tail_port
{
    if (argc < 3)
    {
        fprintf(stderr, "lack port\n");
        exit(1);
    }
    recv_tail_port = atoi(argv[1]);

    send_tail_port = atoi(argv[2]);

    pthread_create(&rec_tail_thread, NULL, send_head_server, NULL);
    pthread_create(&send_tail_thread, NULL, recv_tail_server, NULL);

    pthread_join(rec_tail_thread, NULL);
    pthread_join(send_tail_thread, NULL);
    return 0;
}/*main*/