您的位置:首页 > 其它

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

2014-05-27 12:29 411 查看
服务器:注意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了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: