socket编程---服务器端与客户端简单通信
2012-07-23 16:59
330 查看
服务器端:/*
* File: main.cpp
* Author: xiaomo
*
* Created on 2011年6月22日, 下午8:07
*/
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#include <time.h>
#define SERVER_PORT 2222 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
#define BUFFER_SIZE 10485760
#define WELCOME_MESSAGE "welcome to connect the server. "
ssize_t Read(int sockfd, char* recv, size_t bytes)
{
size_t nleft;
ssize_t nread;
char *ptr = recv;
nleft = bytes;
while(nleft > 0)
{
if((nread = read(sockfd, ptr, nleft)) < 0)
{
if(errno == EINTR)
nread = 0;
else
return -1;
}
else if(nread == 0)
break;
nleft -= nread;
ptr += nread;
}
return(bytes - nleft);
}
ssize_t Write(int sockfd, char* send, size_t bytes)
{
size_t nleft;
ssize_t nwritten;
char* ptr = send;
nleft = bytes;
while(nleft > 0)
{
if((nwritten = write(sockfd, ptr, nleft)) <= 0)
{
if(nwritten < 0 && errno == EINTR)
nwritten = 0;
else
return -1;
}
nleft -= nwritten;
ptr += nwritten;
}
return bytes;
}
int main(int argc, char **argv)
{
int servfd,clifd;
struct sockaddr_in servaddr,cliaddr;
int recvbytes;
if ((servfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{//建立Socket,程序调用Socket函数,该函数返回一个类似于文件描述符的句柄
printf("create socket error!n");
exit(1);
}
//sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
servaddr.sin_addr.s_addr = htons(INADDR_ANY);/*系统自动填入本机IP地址 */
if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{//服务端通过调用 bind函数来配置本地信息。Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。
printf("bind to port %d failure!n",SERVER_PORT);
exit(1);
}
if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0)
{//Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。
printf("call listen failure!n");
exit(1);
}
while (1)
{//server loop will nerver exit unless any body kill the proces
long timestamp;
socklen_t length = sizeof(cliaddr);
//accept()函数让服务器接收客户的连接请求
clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);
if (clifd < 0)
{
printf("error comes when call accept!n");
break;
}
char* buf = new char[BUFFER_SIZE];
strcpy(buf,WELCOME_MESSAGE);
//inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);
printf("from client,IP:%s,Port:%dn",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
timestamp = time(NULL);
strcat(buf,"/ntimestamp in server:");
strcat(buf,ctime(×tamp));
//Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据
Write(clifd,buf,BUFFER_SIZE);
if ((recvbytes=Read(clifd, buf, BUFFER_SIZE)) ==-1) {
perror("recv出错!");
exit(1);
}
buf[recvbytes]='/0';
printf("/nReceived from Client: %s",buf);
delete []buf;
close(clifd);
}//exit
close(servfd);
return 0;
}
客户端:
* File: main.cpp
* Author: xiaomo
*
* Created on 2011年6月22日, 下午8:07
*/
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#include <time.h>
#define SERVER_PORT 2222 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
#define BUFFER_SIZE 10485760
#define WELCOME_MESSAGE "welcome to connect the server. "
ssize_t Read(int sockfd, char* recv, size_t bytes)
{
size_t nleft;
ssize_t nread;
char *ptr = recv;
nleft = bytes;
while(nleft > 0)
{
if((nread = read(sockfd, ptr, nleft)) < 0)
{
if(errno == EINTR)
nread = 0;
else
return -1;
}
else if(nread == 0)
break;
nleft -= nread;
ptr += nread;
}
return(bytes - nleft);
}
ssize_t Write(int sockfd, char* send, size_t bytes)
{
size_t nleft;
ssize_t nwritten;
char* ptr = send;
nleft = bytes;
while(nleft > 0)
{
if((nwritten = write(sockfd, ptr, nleft)) <= 0)
{
if(nwritten < 0 && errno == EINTR)
nwritten = 0;
else
return -1;
}
nleft -= nwritten;
ptr += nwritten;
}
return bytes;
}
int main(int argc, char **argv)
{
int servfd,clifd;
struct sockaddr_in servaddr,cliaddr;
int recvbytes;
if ((servfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{//建立Socket,程序调用Socket函数,该函数返回一个类似于文件描述符的句柄
printf("create socket error!n");
exit(1);
}
//sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
servaddr.sin_addr.s_addr = htons(INADDR_ANY);/*系统自动填入本机IP地址 */
if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{//服务端通过调用 bind函数来配置本地信息。Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。
printf("bind to port %d failure!n",SERVER_PORT);
exit(1);
}
if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0)
{//Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。
printf("call listen failure!n");
exit(1);
}
while (1)
{//server loop will nerver exit unless any body kill the proces
long timestamp;
socklen_t length = sizeof(cliaddr);
//accept()函数让服务器接收客户的连接请求
clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);
if (clifd < 0)
{
printf("error comes when call accept!n");
break;
}
char* buf = new char[BUFFER_SIZE];
strcpy(buf,WELCOME_MESSAGE);
//inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);
printf("from client,IP:%s,Port:%dn",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
timestamp = time(NULL);
strcat(buf,"/ntimestamp in server:");
strcat(buf,ctime(×tamp));
//Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据
Write(clifd,buf,BUFFER_SIZE);
if ((recvbytes=Read(clifd, buf, BUFFER_SIZE)) ==-1) {
perror("recv出错!");
exit(1);
}
buf[recvbytes]='/0';
printf("/nReceived from Client: %s",buf);
delete []buf;
close(clifd);
}//exit
close(servfd);
return 0;
}
客户端:
/* * File: main.cpp * Author: xiaomo * * Created on 2011年6月18日, 下午6:38 */ #include<stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include<unistd.h> #include<arpa/inet.h> #define SERVPORT 2222 #define MAXDATASIZE 1024 /*每次最大数据传输量 */ #define BUFFER_SIZE 255 #define FROMCLIENT "Hi,I'm client./n" int main(int argc, char *argv[]){ int sockfd, recvbytes; char buf[MAXDATASIZE]; // char server_ip[64]; struct sockaddr_in serv_addr; // fgets(server_ip,BUFSIZ,stdin); //从键盘输入数据 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ perror("error!"); exit(1); } serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVPORT); serv_addr.sin_addr.s_addr = htons(INADDR_ANY);//inet_addr(server_ip) bzero(&(serv_addr.sin_zero),8); if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) { perror("connect出错!"); exit(1); } if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) { perror("recv出错!"); exit(1); } buf[recvbytes] = '/0'; printf("/nReceived from Server: %s",buf); strcpy(buf,FROMCLIENT); send(sockfd,buf,BUFFER_SIZE,0); close(sockfd); return 0; }
相关文章推荐
- ios socket编程的客户端和服务器端通信简单实例
- socket编程---服务器端与客户端简单通信
- socket编程---服务器端与客户端简单通信
- Android网络通信----1.Socket编程之简单客户端与服务器端通信
- Android中socket编程实现简单的客户端和服务器之间的通信
- Linux下简单的网络编程笔记(模拟简单的服务器与客户端的通信 1-服务器端)
- socket编程 单向服务端与客户端通信之简单协议,仅供参考
- 【C++】Winsock套接字编程,简单的socket通信代码(客户端、服务端)
- 客户端和服务器端的通信(Socket编程)
- Socket编程服务端和客户端互相通信,实现简单的聊天
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
- socket编程简单服务器端和简单客户端
- 简单用C#编写socket作为客户端与Linux下C++编写服务器端通信(未完善)
- linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
- socket编程(一),实现服务器与客户端简单通信
- linux socket 编程一:简单的服务器和客户端通信
- android的Socket编程---实现简单的服务器,并与客户端通信
- C# Socket编程 一个简单的Socket 客户端服务器通信架构
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
- java网络编程之服务端客户端socket简单通信案例