计算机网络socket linux下用c或c++写

作者&投稿:前英 (若有异议请与网页底部的电邮联系)
Linux下的socket(c++)编程。。~

每张提前计算图片大小,在开头位置发送大小,这样接收到这个大小之后,按这个大小读取就是完整的图片了。

多给点分,写完就给你贴上来

/*服务器*/
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/io.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#define szSTR 256
#define SERVERPORT 21429 /*please modify the port with your id*/

int do_listen(const int port, const int bTcp)
{
int s = 0, r = 0, o = 1;
struct sockaddr_in h;
memset(&h, 0, sizeof(h));
h.sin_family = AF_INET; h.sin_port = htons(port);
h.sin_addr.s_addr = INADDR_ANY;
s = socket(AF_INET, bTcp?SOCK_STREAM:SOCK_DGRAM, 0);
if (s < 1) { perror("socket(listen)"); return 0;}
r = setsockopt(s, SOL_SOCKET,SO_REUSEADDR, (char *)&o, sizeof(int));
if (r == -1) { perror("setsockopt(listen)"); return 0;}
r = bind(s, (struct sockaddr *)&h, sizeof(h));
if (r == -1) { perror("bind(listen)"); return 0;}
if (bTcp) {
r = listen(s, SOMAXCONN);
if (r == -1) { perror("listen()"); return 0;}
}/*end if*/
/*signal(SIGPIPE, SIG_IGN);*/
return s;
}/*end do_listen*/

void response(int sck, struct sockaddr_in * host)
{
FILE * f = 0; char cmd[szSTR]; time_t now;
struct tm * t = 0;
f = fdopen(sck, "w+");
while(!feof(f)) {
memset(cmd, 0, szSTR);
fgets(cmd, szSTR -1, f);
time(&now);
t = localtime(&now);
if(strstr(cmd, "DATE")) {
fprintf(stderr, "Query Type: Date\n");
fprintf(f, "Date: %d %d, %d\n", t->tm_mon + 1, t->tm_mday, t->tm_year + 1900);
continue;
}/*end if*/
if(strstr(cmd, "TIME")) {
fprintf(stderr, "Query Type: Time\n");
fprintf(f, "Time: %02d::%02d::%02d\n", t->tm_hour, t->tm_min, t->tm_sec);
continue;
}/*end if*/
if(strstr(cmd, "EXIT")) break;
fprintf(f, "commands: DATE, TIME, EXIT.\n");
}/*end while*/
shutdown(sck, SHUT_RDWR);
close(sck);
fclose(f);
return ;
}/*end response*/

int main(void)
{
socklen_t sklen = 0;int sck = 0, i = 0, listener = 0;
struct sockaddr_in client; pid_t proc = 0;
system("ifconfig");
listener = do_listen(SERVERPORT, 1);
if(listener < 1) { perror("listen()"); return 0; }
for(i=0;i<2;i++) {
memset(&client, 0, sizeof(client));
sklen = sizeof(client);
sck = accept(listener, (struct sockaddr *)&client, &sklen);
if(sck < 1) break;
proc = fork();
if (proc == -1) { perror("fork()"); break ; }
if(proc) continue;
response(sck, &client);
break;
}/*next*/
close(listener);
return 0;
}/*end main*/

/*客户机*/
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/io.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#define szSTR 256
#define SERVERPORT 21429 /*please modify the port with your id*/
int cnn(const char * ip, const int port)
{
struct sockaddr_in h; memset(&h, 0, sizeof(h));
h.sin_family = AF_INET; h.sin_port = htons(port);
h.sin_addr.s_addr = inet_addr(ip);
int s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 1) { perror("socket(tcp)"); return 0;}
int r = connect(s, (struct sockaddr *)&h, sizeof(h));
if (r == 0) return s;
perror("connect()");
return 0;
}//end cnn

int main(void)
{
int sck = 0; FILE * f = 0; char ip[szSTR]="127.0.0.1";
fprintf(stderr, "Please input the calendar server ip:");
fgets(ip, szSTR - 1, stdin);
sck = cnn(ip, SERVERPORT);
if(sck < 1) return 0;
f = fdopen(sck, "w+");
fprintf(f, "DATE\r\n");
fgets(ip, szSTR -1 , f);
fprintf(stderr, "%s\n", ip);
fprintf(f, "TIME\r\n");
fgets(ip, szSTR -1 , f);
fprintf(stderr, "%s\n", ip);
fprintf(f, "EXIT\r\n");
fclose(f);
close(sck);
return 0;
}/*end main*/

我这有一段最简单的SOCKET连接 服务端的~! 前阵子装Ubuntu 10 后写着实验用的,这是最基本的TCP 服务端框架。各种函数的条用跟 WINDOWS下的一样(我说的WINDOWS下可不是MFC喔~!)客户端自己琢磨,不懂的话再发你~!至于你要的细节,我感觉还是自己写的好
人不能太懒~!必须深入认识否则你领略不到 C程序设计 的精髓~!
//////////代码如下//////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
///////////////////////// H*F*W 2010.05.21 In GuangZhou ///////////////////////////
///////////////////////// LINUX SOCKET 实验最简单服务端 ///////////////////////////
/////////////////////// linux 编程 SOCKET,GTK 有共同兴趣的朋友 +我 Q: 176469428 ////////
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

int Hlisten(unsigned short hport)
{
int hsock,rhsock,cc,alen,ret;
struct sockaddr_in hlsock;
char hbuf[65535];

if((hsock=socket(AF_INET,SOCK_STREAM,0))==-1){printf("Error in socket()\n");return 0;} //建立套接字
memset(&hlsock,0,sizeof(hlsock)); //初始化SOCKET空间
hlsock.sin_family=AF_INET;
hlsock.sin_port=htons(hport); ///监听端口
hlsock.sin_addr.s_addr=htonl(INADDR_ANY); ///地址族

ret=1;
setsockopt(hsock,SOL_SOCKET,SO_REUSEADDR,&ret,sizeof(ret));
if(bind(hsock,(struct sockaddr*)&hlsock,sizeof(hlsock))==-1){printf("Error in bind()\n");return 0;} //帮定
if(listen(hsock,0)==-1){printf("Error in listen()\n");return 0;} ///进入监听状态
alen=sizeof(hlsock);
rhsock=accept(hsock,(struct sockaddr*)&hlsock,&alen); ///接受 客户端接入
while(1)
{
memset(hbuf,0,sizeof(hbuf));
cc=recv(rhsock,hbuf,sizeof(hbuf),0); ///等待接收数据
if(cc==-1)break;
printf("%s",hbuf); ///显示接收内容
}
close(hsock); //关闭连接
return 0;
}

int main(int argc,char*argv[])
{
//if(argc<=1){printf("usge: [port]");return 0;}
Hlisten(330); //调用监听过程 传入监听端口
return 0;
}
///////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
////////////////// 使用gcc 编译直接就可以看到效果////////////////
/////////////////////////////////////////////////////////////////

《TCP/IP Socket网络编程基础(C语言版)》里面有例程,可以去书里说的网站去下载一份例程,我记得有客户端和服务器端的程序,不过好像是一对一的。可以参考一下,多学习一点总没有坏处。

帮顶~等高手


电脑提示"init socket failed"是什么意思
这是初始化安全套接字失败的意思,解决方法:1、卸载所有网络协议,之后重新安装,试试应该可以解决;2、卸载网卡驱动,重装安装网卡驱动试试;3、重装系统。

吉州区13365509262: linux下如何用tcp,c/s模式实现两台电脑之间通信? -
殷勤茗双氯: 1. 建议lz使用socket套接字.这个方式可以很好的实现client/server模式,tcp和udp协议都可以选择.使用socket来实现两台电脑的进程间通信,要先理解一些函数,如socket,binder,listen,connect,recv,send等等... 2. lz可以上网搜索关键字“linux socket编程”,或追问我.

吉州区13365509262: Windows和Linux下的网络编程方法的异同 -
殷勤茗双氯: Linux下的网络编程与Windows下采用底层的API类似,但是也有区别:区别一:Windows下需加上WSAStartup()函数区别二:关闭socket:Linux为close(),Windows为closesocket()windows下采用上层的API,一般有CSocket和CAsynSocket这两种类型的类这种情况以下socket函数一般的首字母大写.而底层的API不管是windows下的还是linux下的socket函数首字母都是小写的.

吉州区13365509262: 在linux系统中用c语言编写一个网络tcp主从通信的socket程序,要求发送数据包 -
殷勤茗双氯: 没有你想象的那么复杂,其实监听端口,然后read或者write就够了.

吉州区13365509262: 谁有linux下的聊天室例子(socket编程)? -
殷勤茗双氯: 客户端建立socket客户端与服务端socket交互,服务端通过广播或单通道的方式将处理后的数据下发2、服务端需要建立socket服务,采用何种技术不重要,java/c/.net这些...

吉州区13365509262: linux怎么启动websocket -
殷勤茗双氯: 一般的可以输入service websocketd start来启动websocket服务,注意这个府服务名后面加了一个d,这是linux服务的命名规范,也可能不用加,你试一下,停止服务把start换成stop就行了,前提是你...

吉州区13365509262: 应该怎样学习?Linux网络编程?Linux网络编程,应该怎样学
殷勤茗双氯: Linux网络编程一般用C语言,也用C++语言,因为有些网络编程的库是C++的,所以C/C++编程基础最起码要有;另外基础知识部分就是网络原理要学,还有Linux平台的基本编程技术(socket、文件相关的系统调用).Linux网络编程基本上是一些编程技巧和代码库的运用以及编程经验的积累,学习到一定程度了可以试着编写一些网络服务器程序.

吉州区13365509262: Linux(或C语言)和JAVA下的socket编程有什么异同点
殷勤茗双氯: 不同: 1.首先2者提供的接口不同,这点很容易区分. 2.java跨平台,写好的程序不用做任何修改就可以放到linux或者windows或者苹果等诸多操作系统上运行,C当然可以,但linux本身提供了socket的系统调用,你如果使用的是linux系统调用,...

吉州区13365509262: linux socket返回的int值是什么 文件描述符一样的东西吗 -
殷勤茗双氯: 对,socket成功建立后,返回值是一个特殊的文件描述符.这个描述符对应的不是物理文件,而是一个socket.当初,unix在加入socket功能时,将网络传输功能与文件...

吉州区13365509262: 关于Linux下socket编程的问题 -
殷勤茗双氯: recv 函数,不能保证接受到所有你需要的数据包因此要反复调用recv函数. 并查看函数的返回值比如,你需要接受5000字节datalen=0while datalen<5000 ret=recv(...) datalen+=ret...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网