以下代码在centos6.2测试通过
客户端代码如下:
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <iostream>
#include <stdio.h>
#include <errno.h>
using namespace std;
#define MAXLINE 4096 /* max text line length */
int main(int argc, char ** argv)
{
int sockfd, n;
char recvline[MAXLINE+1];
struct sockaddr_in serveraddr;
if(argc != 2)
{
cout << "para error " << endl;
return 0;
}
if((sockfd=socket(AF_INET, SOCK_STREAM, 0))<0)
{
cout << "socket error" << endl;
return 0;
}
memset(&serveraddr,0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(10000);
if(inet_pton(AF_INET, argv[1], &serveraddr.sin_addr)<=0)
{
cout << "inet_pton error for " << argv[1] << endl;
return 0;
}
int tmp = connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
if(tmp <0)
{
cout << "connect error" << tmp << endl;
cout << "error info " << errno << endl;
return 0;
}
while((n=read(sockfd, recvline, MAXLINE)) > 0)
{
recvline[n] = 0;
if(fputs(recvline, stdout) == EOF)
{
cout << "fputs error" << endl;
}
}
if(n<0)
{
cout << "read error" << endl;
}
return 1;
}
服务器端代码如下:
#include <arpa/inet.h> // sockaddr head
#include <string.h> //memset and strlen head
#include <sys/socket.h> //socket listen bind
#include <iostream>
#include <time.h>
#include <stdio.h>
#define MAXLINE 4096
#define LISTENQ 1024
using namespace std;
int main(int argc, char ** argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(10000);
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
int ret = listen(listenfd,LISTENQ);
cout << "go to listen" <<ret<< endl;
for(; ;)
{
connfd = accept(listenfd, (struct sockaddr *)NULL, NULL);
cout << "connfd = " << connfd << endl;
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
write(connfd, buff, strlen(buff));
close(connfd);
}
return 0;
}