服务器:注意accept处有错的
/*
先看TCP服务器端的程序:
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 10000
int main(int argc, char *argv[])
{
int sockfd,new_fd = 0;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
int nbytes;
char buffer[1024];
/* 服务器端开始建立sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}
/* 服务器端填充 sockaddr结构 */
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(PORT);
/* 捆绑sockfd描述符到IP地址 */
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
/* 设置允许连接的最大客户端数 */
if(listen(sockfd,5)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}
while(1)
{
/* 服务器阻塞,直到客户程序建立连接 */
memset(buffer, '\0', sizeof(buffer));
sin_size=sizeof(struct sockaddr_in);
if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
char IPdes[16]="";
inet_ntop(AF_INET, (void *)&client_addr.sin_addr, IPdes, 16);
fprintf(stderr,"Server get connection from %s\n",IPdes);
if((nbytes=read(new_fd,buffer,1024))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("Server received %s\n",buffer);
}
/* 结束通讯 */
close(sockfd);
exit(0);
}
客户端:
/*
再看客户端的程序:
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 10000
int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024] = "hello";
struct sockaddr_in server_addr;
/* 客户程序开始建立 sockfd描述符 */;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);
again:
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
goto again;
}
if(write(sockfd,buffer,strlen(buffer)) <= 0)
{
goto again;
}
printf("write ok\n");
return 0;
}
先运行tcpserver
再运行:
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# ps -ef | grep tcpserver
root 12254 9880 0 21:18 pts/2 00:00:00 ./tcpserver
root 12257 9892 0 21:19 pts/3 00:00:00 grep --color=auto tcpserver
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# st
start start-pulseaudio-x11 stat stdbuf strings
startpar start-stop-daemon static-sh stop strip
start-pulseaudio-kde startx status strace stty
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# strace -p 12254
Process 12254 attached - interrupt to quit
accept(3, {sa_family=AF_INET, sin_port=htons(46666), sin_addr=inet_addr("127.0.0.1")}, [16]) = 4
write(2, "Server get connection from 127.0"..., 37) = 37
read(0,
再运行客户端
即可看到结果: read的第一个参数fd=0了
本文介绍了一个简单的TCP服务器和客户端程序的实现方式。服务器监听特定端口并接受客户端连接请求,客户端则主动发起连接并向服务器发送消息。通过示例代码展示了如何使用socket编程进行网络通信。
1219

被折叠的 条评论
为什么被折叠?



