看程序系统调用流程-strace使用

本文介绍了一个简单的TCP服务器和客户端程序的实现方式。服务器监听特定端口并接受客户端连接请求,客户端则主动发起连接并向服务器发送消息。通过示例代码展示了如何使用socket编程进行网络通信。

服务器:注意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了






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁吃大象666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值