//服務端server.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 6000 /*伺服器監聽埠號 */
#define BACKLOG 10 /* 最大同時連接請求數 */
#define MAXDATASIZE 100
main()
{
char buf[MAXDATASIZE];
int sockfd,client_fd; /*sock_fd:監聽socket;client_fd:數據傳輸socket */
struct sockaddr_in my_addr; /* 本機地址信息 */
struct sockaddr_in remote_addr; /* 客戶端地址信息 */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket創建出錯!");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind出錯!");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen出錯!");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror("accept出錯");
continue;
}
printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if (!fork())
{ /* 子進程代碼段 */
if ((recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出錯!");
close(client_fd);
exit(0);
}
buf[recvbytes] = '\0';
printf("from client Received: %s",buf);
if (send(client_fd, "thanks!\n", 8, 0) == -1)
perror("send出錯!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}
//客戶端client.c
#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>
#define SERVPORT 6000
#define MAXDATASIZE 100
main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc < 2)
{
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname出錯!");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket創建出錯!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect出錯!");
exit(1);
}
if (send(sockfd, "hello!\n", 7, 0) == -1)
{
perror("send出錯!");
exit(1);
}
if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出錯!");
exit(1);
}
buf[recvbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
}
㈡ socket linux c++ send()函數
給你一個代碼,linux下編譯運行即可,做了簡單的注釋,client.c如下:
send()函數在client.c末尾
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#defineMAXLINE4096//發送接受信息長度
#definePORT6666//埠
intmain(intargc,char**argv)
{
intsockfd,n;
charrecvline[MAXLINE],sendline[MAXLINE];
structsockaddr_inservaddr;
if(argc!=2){
printf("usage:./client<ipaddress> ");//使用方法
exit(0);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){//創建套接字,並未連接
printf("createsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}
//memset(結構體地址,清零,要清零的長度);清零結構體servaddr,將結構體數據全部設置為0
//同bzero(結構體地址,要清理的長度);默認清零
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;//sa_family是通信類型,最常用的值是"AF_INET"
servaddr.sin_port=htons(PORT);//埠號
//servaddr.sin_addr.s_addr=inet_addr(argv[1]);//伺服器IP,如下功能相同
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0){
printf("inet_ptonerrorfor%s ",argv[1]);
exit(0);
}
//連接伺服器
if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){
printf("connecterror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}
printf("sendmsgtoserver: ");
fgets(sendline,MAXLINE,stdin);//輸入向伺服器發送的信息
if(send(sockfd,sendline,strlen(sendline),0)<0)//向伺服器發送信息
{
printf("sendmsgerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}
close(sockfd);//關閉套接字
exit(0);
}
伺服器程序:server.c如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#defineMAXLINE4096
#definePORT6666
intmain(intargc,char**argv)
{
intlistenfd,connfd;
structsockaddr_inservaddr;
charbuff[MAXLINE];
intn;
if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){//創建套接字
printf("createsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}
memset(&servaddr,0,sizeof(servaddr));//結構體清零
servaddr.sin_family=AF_INET;//sa_family是通信類型,最常用的值是"AF_INET"
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//指定接受任何連接
servaddr.sin_port=htons(PORT);//監聽埠
//給套介面綁定地址
if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))==-1){
printf("bindsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}
if(listen(listenfd,10)==-1){//開始監聽,最大請求數為10,可以自己設置
printf("listensocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}
printf("======waitingforclient'srequest====== ");
while(1){
//建立通信,等待客戶端connect()函數的連接
if((connfd=accept(listenfd,(structsockaddr*)NULL,NULL))==-1)
{
printf("acceptsocketerror:%s(errno:%d)",strerror(errno),errno);
continue;
}
n=recv(connfd,buff,MAXLINE,0);//n可以判斷錯誤,此處可直接用recv()函數
//接收到的信息存放在buff中
buff[n]='