c语言send
❶ c语言 send()函数理解
使用函数getsockopt获得发送缓冲区的长度。用法如下:
int sockfd;
int val;
int len;
sockfd = socket (AF_INET, SOCK_STREAM, 0);
len = sizeof (val);
getsockopt( sockfd, SOL_SOCKET, SO_SNDBUF, &val, &len);
printf ("sndbuf len=%d\n", val);
在32位linux系统上发送缓冲区为16K ,可以使用setsockopt()修改,会影响网络性能
❷ C语言发送邮件
基本框架就是这,需要其他功能自己添加吧
C语言实现简单的SMTP发送邮件
#include <windows.h>
#include <stdio.h>
#include <WinSock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
struct Base64Date6
{
unsigned int d4:6;
unsigned int d3:6;
unsigned int d2:6;
unsigned int d1:6;
};
// 协议中加密部分使用的是base64方法
char ConvertToBase64 (char c6);
void EncodeBase64 (char *dbuf, char *buf128, int len);
void SendMail (char *email,char *body);
int OpenSocket (struct sockaddr *addr);
int main()
{
char EmailTo[] = "[email protected]";
char EmailContents[] = "From: \"lucy\"<[email protected]>\r\n"
"To: \"dasiy\"<[email protected]>\r\n"
"Subject: Hello\r\n\r\n"
"Hello World, Hello Email!";
SendMail(EmailTo, EmailContents);
return 0;
}
char ConvertToBase64(char uc)
{
if(uc < 26)
{
return 'A' + uc;
}
if(uc < 52)
{
return 'a' + (uc - 26);
}
if(uc < 62)
{
return '0' + (uc - 52);
}
if(uc == 62)
{
return '+';
}
return '/';
}
// base64的实现
void EncodeBase64(char *dbuf, char *buf128, int len)
{
struct Base64Date6 *ddd = NULL;
int i = 0;
char buf[256] = {0};
char *tmp = NULL;
char cc = '\0';
memset(buf, 0, 256);
strcpy_s(buf, 256, buf128);
for(i = 1; i <= len/3; i++)
{
tmp = buf + (i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3);
dbuf[(i-1)*4+3] = ConvertToBase64((unsigned int)ddd->d4);
}
if(len % 3 == 1)
{
tmp = buf + (i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = '=';
dbuf[(i-1)*4+3] = '=';
}
if(len%3 == 2)
{
tmp = buf+(i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3);
dbuf[(i-1)*4+3] = '=';
}
return;
}
// 发送邮件
void SendMail(char *email, char *body)
{
int sockfd = {0};
char buf[1500] = {0};
char rbuf[1500] = {0};
char login[128] = {0};
char pass[128] = {0};
WSADATA WSAData;
struct sockaddr_in their_addr = {0};
WSAStartup(MAKEWORD(2, 2), &WSAData);
memset(&their_addr, 0, sizeof(their_addr));
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(25);
hostent* hptr = gethostbyname("smtp.126.com");
memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length);
printf("IP of smpt.126.com is : %d:%d:%d:%d\n",
their_addr.sin_addr.S_un.S_un_b.s_b1,
their_addr.sin_addr.S_un.S_un_b.s_b2,
their_addr.sin_addr.S_un.S_un_b.s_b3,
their_addr.sin_addr.S_un.S_un_b.s_b4);
// 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
while(recv(sockfd, rbuf, 1500, 0) == 0)
{
cout<<"reconnect..."<<endl;
Sleep(2);
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
}
cout<<rbuf<<endl;
// EHLO
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "EHLO HYL-PC\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"EHLO REceive: "<<rbuf<<endl;
// AUTH LOGIN
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "AUTH LOGIN\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Auth Login Receive: "<<rbuf<<endl;
// USER
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "[email protected]");//你的邮箱账号
memset(login, 0, 128);
EncodeBase64(login, buf, strlen(buf));
sprintf_s(buf, 1500, "%s\r\n", login);
send(sockfd, buf, strlen(buf), 0);
cout<<"Base64 UserName: "<<buf<<endl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"User Login Receive: "<<rbuf<<endl;
// PASSWORD
sprintf_s(buf, 1500, "XXXXXXXXXXXX");//你的邮箱密码
memset(pass, 0, 128);
EncodeBase64(pass, buf, strlen(buf));
sprintf_s(buf, 1500, "%s\r\n", pass);
send(sockfd, buf, strlen(buf), 0);
cout<<"Base64 Password: "<<buf<<endl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Password Receive: "<<rbuf<<endl;
// MAIL FROM
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "MAIL FROM: <[email protected]>\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"set Mail From Receive: "<<rbuf<<endl;
// RCPT TO 第一个收件人
sprintf_s(buf, 1500, "RCPT TO:<%s>\r\n", email);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Tell Sendto Receive: "<<rbuf<<endl;
// DATA 准备开始发送邮件内容
sprintf_s(buf, 1500, "DATA\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Mail Prepare Receive: "<<rbuf<<endl;
// 发送邮件内容,\r\n.\r\n内容结束标记
sprintf_s(buf, 1500, "%s\r\n.\r\n", body);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Mail Receive: "<<rbuf<<endl;
// QUIT
sprintf_s(buf, 1500, "QUIT\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Quit Receive: "<<rbuf<<endl;
//清理工作
closesocket(sockfd);
WSACleanup();
return;
}
// 打开TCP Socket连接
int OpenSocket(struct sockaddr *addr)
{
int sockfd = 0;
sockfd=socket(PF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
cout<<"Open sockfd(TCP) error!"<<endl;
exit(-1);
}
if(connect(sockfd, addr, sizeof(struct sockaddr)) < 0)
{
cout<<"Connect sockfd(TCP) error!"<<endl;
exit(-1);
}
return sockfd;
}
❸ c语言。sendbyte()函数
语法上看:
P2&=0xC0;//p2 与等于 0xc0,相当 P2 = P2&0XC0,
sendbyte(data1);//把data1变量作为参数传给函数sendbyte,看函数名,似乎是要发送数据的样子
P2|=0x01;//这句 相当于 P2 = P2|0X01,作用是将P2的最低位值1
❹ send是什么意思
【基本释义】send英 [send] 美 [sɛnd]
vt. 发送,寄;派遣;使进入;发射
vi. 派人;寄信
n. 上升运动
n. (Send)人名;(德)森德
[ 过去式 sent 过去分词 sent 现在分词 sending ]
【专业释义及短语】
send [send]
vt.
1、打发,派遣,差遣,派…前去(请人等):
to send somebody to do something
2、派某人去做某事
to send (someone) for a doctor
3、派某人去请大夫
4、使前往;使进入(to ):
to send to the prison
进监狱
5、寄,发送(信件,邮包等):
to send a letter to somebody
6、投,掷;击出:
to send a punch to the jaw
一拳击在下巴上
7、使进入(某状态);迫使(in, into):
to send someone into madness
8、使某人发疯
9、指点:
to send someone to the police
指点某人去警察局
10、(上天)赐福给,降(福、祸等):
God send us!
上帝保佑!
11、[俚语]使高兴,使…兴奋:
It sends me into the sky.
这真令我飘飘欲仙。
12、散发出,放出(香味等):
to send forth a sweet odor
发出一股香味
【电子学】
vi.
派遣;发出,派人:
He was sent abroad.
他被派到了海外工作。
【电子学】发信号
adj.
[仅用作定语]用于发送的
短语:
1、God send it may not be so! 但愿不是这样!
2、send flying 撵走,解雇;使四散
3、send someone mad 令某人发疯
4、send someone packing (或about his business) 解雇某人;撵走某人
5、send someone sprawling 把某人打倒在地
6、send someone to Coventry 见 Coventry
变形:
vt. sent . sending
send2 [send]
n., vi. sended 或sent, sending 【航海学】 = scend
【词组短语】
send out 发送;派遣;放出
send in 递送;呈报;命…进来
send for 召唤,派人去叫;派人去拿
send back 送回;退还
send a message 发信息
【例句】
1、Please send the book along to me.
请快些把那本书寄给我。
2、You should come or send a representative at least.
你应该来,或者说,至少派一位代表来。
3、The dispute at the moment revolved about the question of whom to send.
当时的争论是围绕着派谁去好这一问题而进行的。
❺ C语言 socket编程 客户端只send一次 但是服务器会循环执行这条命令 在线等
recv(comm_socket,recv_buff, sizeof(recv_buff), 0); /*receiveclient's command*/
改成
int ret = recv(comm_socket,recv_buff, sizeof(recv_buff), 0); /*receiveclient's command*/
if ret == -1 || ret == 0
break
== -1 表示出错, =0 表示 socket 已经关闭。
❻ send是什么意思
1.sendsend英 [send] 美 [sɛnd]
vt.送;派遣;使作出(某种反应);使进入(某状态)
vt.& vi.用无线电波发送,发出信息
vi.派遣,发出,派人
adj.[仅用作定语]用于发送
2.send是一个C语言函数,可以用于向窗口发送非PowerBuilder预定义事件的消息。
❼ C 语言socket 的send数据太大,最大能发送多少如何分批发送
是这样,如果是UDP传输,一般就是1500左右。如果是TCP大小不一定,比如你要传10000,有可能一次传的量是小于10000的任意量。
为了解决这个问题,我建议你用阻塞的SOCKET ,TCP传输,用一个循环接收一个大数据包,每次接到多少字节就将内存下表移动多少,在下次循环中继续接受,直到传完一个整包。
❽ C语言中SOCKET关于send和recv的问题,不懂别乱贴
说实在的这个问题非常简单,不过你习惯太差,你把send和recv的返回值看看不就明白了!
前提是你描述的都是事实。
否则还可能有Socket问题。
如果是linux,strace一下就知道什么问题了。
Windows的也很简单。
前面的明显不正确,send如果是TCP,(UDP 不应该用send),send返回时,消息已经发出了。
❾ 在C语言中send buff的用法
buff是数组名字,中文解释是缓冲区,一般程序员习惯用buff在存放字符串。
❿ 用C语言编写socket程序时,听说send函数有个阻塞模式,不知怎样才能把它设置为阻塞模式
默认情况下就是阻塞模式了