今天学习了TCP协议的知识,写了一个本机测试套接字收发的例子,用到了TCP编程和线程的一些函数,在vim下运行无误,代码如下:
客户端:
<p>#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<unistd.h>
#include<pthread.h>
#include<errno.h>
void *cil_recv(void *arg)</p>{
int fd = (int)arg;
char buff[100];
int ret;
while(1)
{
ret = read(fd,buff,100);
write(1,buff,ret);
}
}
int main()
{
draw();
int fd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(7770);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));
pthread_t tid;
pthread_create(&tid,NULL,cil_recv,(void *)fd);
char buff[100];
int ret;
while(1)
{
fgets(buff,100,stdin);
write(fd,buff,strlen(buff));
if(strncmp(buff,"quit",4)==0)
{
pthread_cancel(tid);
break;
}
}
close(fd);
return 0;
}
<p>#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<unistd.h>
#include<pthread.h>
#include<errno.h>
void *cil_recv(void *arg)</p>{
int fd = (int)arg;
char buff[100];
int ret;
while(1)
{
ret = read(fd,buff,100);
write(1,buff,ret);
}
}
int main()
{
draw();
int fd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(7770);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));
pthread_t tid;
pthread_create(&tid,NULL,cil_recv,(void *)fd);
char buff[100];
int ret;
while(1)
{
fgets(buff,100,stdin);
write(fd,buff,strlen(buff));
if(strncmp(buff,"quit",4)==0)
{
pthread_cancel(tid);
break;
}
}
close(fd);
return 0;
}
服务端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h> //socket()
#include<netinet/in.h> //inet_addr()
#include<arpa/inet.h>
#include<unistd.h> //read() /write()
#include<pthread.h>
#include<errno.h>
void *ser_send(void *arg)
{
char buff[100];
int newfd = (int)arg;
while(1)
{
fgets(buff,100,stdin);
write(newfd,buff,strlen(buff));
}
}
int main()
{
draw();
int fd = socket(AF_INET,SOCK_STREAM,0);
printf("socket id = %d\n",fd);
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(7770);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
int err = bind(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(err < 0)
{
fprintf(stderr,"%s\n",strerror(err));
return -1;
}
listen(fd,5);
int newfd;
struct sockaddr_in peer;
socklen_t size;
size = sizeof(peer);
while(1)
{
printf("waiting for client connectting...\n");
newfd = accept(fd,(struct sockaddr *)&peer,&size);
printf("ip:%s,port:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));
pthread_t tid;
pthread_create(&tid,NULL,ser_send,(void *)newfd);
char buff[100];
int cnt;
while(1)
{
cnt = read(newfd,buff,100);
write(1,buff,cnt);
buff[cnt] = '\0';
if(strncmp(buff,"quit",4)==0)
{
pthread_cancel(tid);
break;
}
}
close(newfd);
}
close(fd);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h> //socket()
#include<netinet/in.h> //inet_addr()
#include<arpa/inet.h>
#include<unistd.h> //read() /write()
#include<pthread.h>
#include<errno.h>
void *ser_send(void *arg)
{
char buff[100];
int newfd = (int)arg;
while(1)
{
fgets(buff,100,stdin);
write(newfd,buff,strlen(buff));
}
}
int main()
{
draw();
int fd = socket(AF_INET,SOCK_STREAM,0);
printf("socket id = %d\n",fd);
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(7770);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
int err = bind(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(err < 0)
{
fprintf(stderr,"%s\n",strerror(err));
return -1;
}
listen(fd,5);
int newfd;
struct sockaddr_in peer;
socklen_t size;
size = sizeof(peer);
while(1)
{
printf("waiting for client connectting...\n");
newfd = accept(fd,(struct sockaddr *)&peer,&size);
printf("ip:%s,port:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));
pthread_t tid;
pthread_create(&tid,NULL,ser_send,(void *)newfd);
char buff[100];
int cnt;
while(1)
{
cnt = read(newfd,buff,100);
write(1,buff,cnt);
buff[cnt] = '\0';
if(strncmp(buff,"quit",4)==0)
{
pthread_cancel(tid);
break;
}
}
close(newfd);
}
close(fd);
return 0;
}