linux socket线程,linux socket聊天程序(线程版本pthread)

/******************server.c*************/

#include

#include

#include

#include

#include

#include

#include

#define PORT 1234

#define BACKLOG 1

#define MAXDATASIZE 100

struct ARG

{

int connfd;

struct sockaddr_in client;

};

void *func(void *arg );

void main()

{

pthread_t tid;

int listenfd, connectfd;

struct sockaddr_in server;

struct sockaddr_in client;

socklen_t addrlen;

char buf[MAXDATASIZE];

struct ARG *arg, in;

arg = ∈

if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

perror("socket() error.");

exit(1);

}

int opt = 1;

setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

bzero(&server, sizeof(server));

server.sin_family = AF_INET;

server.sin_port = htons(PORT);

server.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1)

{

perror("bind() error.");

exit(1);

}

if(listen(listenfd, BACKLOG) == -1)

{

perror("listen() error.");

exit(1);

}

addrlen = sizeof(client);

while(1)

{

if((connectfd = accept(listenfd, (struct sockaddr *)&client, &addrlen )) == -1)

{

perror("accept() error.");

exit(1);

}

printf("You got a connection from client ip is: %s,port is:%d/n"

,inet_ntoa(client.sin_addr), htons(client.sin_port));

//arg = (struct ARG *)malloc(sizeof(struct ARG));

arg->connfd = connectfd;

arg->client = client;

if(pthread_create(&tid, NULL, func, (void *)arg))

{

perror("error pthread_create");

exit(1);

}

while(1)

{

recv(connectfd, buf, MAXDATASIZE,0);

printf("the client says: %s/n",buf);

}

close(connectfd);

close(listenfd);

}

}

void *func(void *arg)

{

char buf[MAXDATASIZE];

struct ARG *info;

info =  (struct ARG *)arg;

while(1)

{

fgets(buf, MAXDATASIZE, stdin);

send(info->connfd, buf, MAXDATASIZE, 0);

}

}

//下面是客户端

//client.c///

#include

#include

#include

#include

#include

#include

#include

#define PORT 1234

#define MAXDATASIZE 100

void *func(void *arg);

int main ( int argc, char *argv[])

{

pthread_t tid;

int sockfd, num;

char buf[MAXDATASIZE] ="123456789";

struct hostent *he;

struct sockaddr_in server;

if(argc!=2)

{

printf("usage %s/n",argv[0]);

exit(1);

}

if((he = gethostbyname(argv[1])) == NULL)

{

printf("gethostbyname error/n");

exit(1);

}

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

printf("socket() error /n");

exit(1);

}

bzero(&server, sizeof(server));

server.sin_family = AF_INET;

server.sin_port = htons(PORT);

server.sin_addr = *((struct in_addr *)he->h_addr);

if(connect(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)

{

printf("connetc() error/n");

exit(1);

}

if(pthread_create(&tid, NULL, func, (void *)&sockfd))

{

perror("error pthread_create");

return 2;

}

while(1)

{

num= recv(sockfd, buf, MAXDATASIZE, 0);

printf("server message: %s/n",buf);

}

close(sockfd);

}

void *func(void *arg){ int *sockfd; char buf[MAXDATASIZE]; sockfd = (int *)arg; while(1) { fgets(buf, MAXDATASIZE, stdin);   send(*sockfd, buf, MAXDATASIZE, 0); }}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值