您的位置:首页 > 理论基础 > 计算机网络

网络通信TCP编程实例代码

2016-05-23 18:02 507 查看
Makefile:

all:
gcc -o server server.c -lpthread
gcc -o client client.c

clean:
rm server client


server.c:

/*TCP:
server.c
*/

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>

void *do_work(void *arg);

int main(int argc,char *argv[])
{
int sockfd;
int ret;

/*1.调用socket建立网络套接字*/
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd){
perror("socket server");
return -1;
}

/*2.填充服务器地址和端口号*/
struct sockaddr_in servaddr;
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;        //协议族
servaddr.sin_port = htons(6775);    //端口号5001-65536
servaddr.sin_addr.s_addr = inet_addr("192.168.7.223"); //ip地址
socklen_t alen = sizeof(servaddr);

/*3.调用bind绑定服务器地址和端口*/
ret = bind(sockfd,(struct sockaddr *)&servaddr,alen);
if(-1 == ret){
perror("bind");
return -1;
}

/*4.调用listen主动监听是否有客户连接*/
ret = listen(sockfd,10);
if(-1 == ret){
perror("listen");
return -1;
}
printf("servet init.d success...\n");

int newfd = -1;     //新的套接字描述符
char buf[1024] = {0};
pthread_t tid;        //新建线程ID

while(1)
{
/*5.调用accept接受客户端连接*/
newfd = accept(sockfd,NULL,NULL);
if(newfd <= 0){
continue;
}
printf("==>%d connect success..\n",newfd);

/*为每个客户开辟一个线程去管理*/
ret = pthread_create(&tid,NULL,do_work,&newfd);
if(0 != ret){
perror("pthread_create failed\n");
break;
}
pthread_detach(tid);//设置为分离态,资源由系统自动回收

}

/*7.关闭打开的网络套接字***/
close(sockfd);
close(newfd);

return 0;
}

/*线程执行函数*/
void *do_work(void *arg)
{
int newfd = *(int *)arg;
int ret;
char buf[1024];

/*6.调用read/write读写网络文件*/
while(1)
{
memset(buf,0,sizeof(buf));
ret = read(newfd,buf,sizeof(buf)-1);
if(ret > 0){
printf("recv data:%s\n",buf);
}
}

pthread_exit(NULL);
}


client.c:

/*TCP:
client.c
*/

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
int sockfd;
int ret;
char buf[1024] = {0};

/*1.调用socket建立网络套接字*/
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd){
perror("socket server");
return -1;
}

/*2.填充服务器地址和端口号*/
struct sockaddr_in servaddr;
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;        //协议族
servaddr.sin_port = htons(6775);    //端口号5001-65536
servaddr.sin_addr.s_addr = inet_addr("192.168.7.223"); //ip地址
socklen_t alen = sizeof(servaddr);

/*3.调用connect连接服务器(根据ip地址和端口去连接)*/
ret = connect(sockfd,(struct sockaddr *)&servaddr,alen);
if(-1 == ret){
perror("connect");
return -1;
}
printf("client connect success...\n");

/*4.调用read/write读写网络文件*/
while(1)
{
/*从终端获取信息*/
memset(buf,0,sizeof(buf));
ret = read(0,buf,sizeof(buf)-1);
if(ret > 0){

/*发送给服务器*/
write(sockfd,buf,ret);
}
}

/*7.关闭打开的网络套接字***/
close(sockfd);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: